Maheen Siddiqui
Maheen Siddiqui

Reputation: 539

Looping through a matrix and plotting in R

I have two matrices in R lag_mat and r_mat and both have dimensions 16x16x3x2x2.

I have the following code that I use to create plot these in R.

library(R.matlab) 
library("wesanderson")  
library("ggplot2")
library("ggsci") 
library(corrplot)
library(plotly)
library(viridis) 

#CCO left and right stimulation time window 2
lag_mat = matrix(CCO_lag[, , 1,2], 16)
r_mat = matrix(CCO[, , 1,2], 16)
row = c(row(lag_mat))
col = c(col(lag_mat)) 
dd = data.frame( lag = c(lag_mat), r = c(r_mat), row, col ) 

p1 <- ggplot(dd, aes(x = row, y = col, size = lag, color = r)) +
  geom_point(  alpha = 1.5, stroke = 2.5) +
  ggtitle("CCO, RIGHT Stimulation") +
  theme(plot.title = element_text(size=10, face="bold"), 
        legend.position = "none",
        axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                        colour = "white"), 
        panel.grid.minor = element_line(size = 0.5, linetype = 'solid',
                                        colour = "white"),axis.text.x = element_text(size=8)) + 
  # scale_color_viridis( begin = 0.2 , end = 1, direction = 1 )+  
  scale_color_gradient2(low = "#4169E1"  , mid =  "#ffffbf" , high =   "#FF8C00", limits=c(-1 ,1)) +
  #  scale_y_reverse() +
  #  scale_size_area(trans = "reverse")+
  scale_size_continuous(range = c(5,0),limits=c(-12,0))+
  scale_x_discrete(limits=c("CP1","P7","P3","Pz","PO3","T1", "M1","Oz","M2","T2","PO4","P4","P8", "CP2","Cz","Fz")) +
  scale_y_continuous(limits = c(1,16),breaks=seq(1,16,1)) 

The issue that I am having is that I need to loop through the last dimension. I have run some more analyses and instead of the last dimension of the matrices being 2, it's now 21. I used to just have two scripts that I used, one where I plotted (i.e. each of the dimensions in different scripts - not very efficient, I know).

r_mat = matrix(CCO[, , 1,1], 16)

and the other for

r_mat = matrix(CCO[, , 1,2], 16)

But now of course I can't have 21 scripts but I'm unsure how to loop and plot in R.

Can anyone help me with this? So I could loop through the last dimension and plot 21 figures using ggplot?

Thanks!

Here is the data, I have reproduced a smaller matrix such that both matrices are not dimension 16x16x1x2.

CCO<-structure(c(-0.492578655481339, NaN, NaN, NaN, -0.492525190114975, 
-0.492525696754456, NaN, -0.492627799510956, -0.492677986621857, 
-0.492468953132629, NaN, NaN, NaN, -0.49228835105896, -0.492546766996384, 
-0.492437690496445, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, -0.521651923656464, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
0.473261743783951, NaN, 0.472789525985718, -0.600778460502625, 
NaN, NaN, -0.600829541683197, -0.6008580327034, -0.601057589054108, 
NaN, -0.600822031497955, -0.600911736488342, -0.600730240345001, 
NaN, NaN, NaN, -0.600953936576843, -0.600802004337311, -0.600861430168152, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, -0.521026790142059, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, -0.577225089073181, NaN, NaN, -0.577208399772644, 
-0.577145278453827, -0.577321112155914, NaN, -0.577184557914734, 
-0.577165722846985, -0.577133357524872, NaN, NaN, NaN, -0.577190637588501, 
-0.577230930328369, -0.577144026756287, -0.41020467877388, NaN, 
NaN, NaN, -0.410186648368835, -0.410334318876266, NaN, -0.410211980342865, 
-0.410197377204895, -0.410110324621201, NaN, NaN, NaN, -0.410272806882858, 
NaN, NaN, -0.733388960361481, NaN, NaN, NaN, NaN, -0.733434438705444, 
NaN, -0.733347833156586, -0.733303666114807, -0.733347356319427, 
NaN, NaN, NaN, NaN, -0.733397245407104, -0.73332667350769, -0.702324509620667, 
NaN, NaN, NaN, NaN, NaN, NaN, -0.702237844467163, -0.702238082885742, 
-0.702193081378937, NaN, NaN, NaN, -0.702261865139008, -0.702301025390625, 
NaN, -0.80294394493103, NaN, NaN, -0.802956938743591, -0.802938997745514, 
-0.803096830844879, NaN, -0.802961885929108, -0.802923500537872, 
-0.802861630916595, NaN, NaN, NaN, -0.803063333034515, -0.802979350090027, 
-0.802873134613037, -0.684592604637146, NaN, NaN, -0.684580564498901, 
-0.684580743312836, -0.684802889823914, NaN, -0.684630811214447, 
-0.684578239917755, -0.684465110301971, NaN, NaN, NaN, -0.684730887413025, 
-0.684608578681946, -0.684436023235321, -0.606923937797546, NaN, 
NaN, NaN, -0.606987476348877, NaN, NaN, -0.606982827186584, NaN, 
NaN, NaN, NaN, NaN, -0.606993675231934, NaN, NaN, -0.746234655380249, 
NaN, NaN, -0.7463099360466, -0.746258854866028, -0.746564209461212, 
NaN, -0.746362566947937, -0.746387183666229, -0.746385276317596, 
NaN, NaN, NaN, -0.746756434440613, -0.746286571025848, -0.746472299098969, 
NaN, NaN, NaN, NaN, -0.526792407035828, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, -0.526629209518433, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, -0.402197241783142, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, -0.515719473361969, NaN, NaN, NaN, -0.515782594680786, 
-0.516006171703339, NaN, -0.515946447849274, -0.515853404998779, 
-0.515883803367615, NaN, NaN, NaN, -0.515994668006897, -0.515867114067078, 
-0.515911042690277, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, -0.4820496737957, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
0.535082995891571, NaN, 0.534462213516235, -0.567049205303192, 
NaN, NaN, -0.567097425460815, -0.567124307155609, -0.567312657833099, 
NaN, -0.567090332508087, -0.567174971103668, -0.567003667354584, 
NaN, NaN, NaN, -0.567214787006378, -0.567071437835693, -0.567127525806427, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, -0.437827885150909, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, -0.496517241001129, NaN, NaN, -0.496502816677094, 
-0.496448516845703, -0.496599793434143, NaN, -0.496482282876968, 
-0.496466100215912, -0.496438264846802, NaN, NaN, NaN, -0.496487557888031, 
-0.496522217988968, -0.496447324752808, 0.43168780207634, NaN, 
NaN, NaN, 0.43162015080452, 0.431624948978424, NaN, 0.43173423409462, 
0.431787043809891, 0.431506514549255, NaN, NaN, NaN, 0.431388199329376, 
NaN, NaN, -0.673626005649567, NaN, NaN, NaN, NaN, -0.673667669296265, 
NaN, -0.67358809709549, -0.673547565937042, -0.673587679862976, 
NaN, NaN, NaN, NaN, -0.673633456230164, -0.673568665981293, -0.657320320606232, 
NaN, NaN, NaN, NaN, NaN, NaN, -0.65728884935379, -0.657253861427307, 
-0.657285273075104, NaN, NaN, NaN, -0.657291948795319, -0.657335460186005, 
NaN, -0.793729186058044, NaN, NaN, -0.793741881847382, -0.793724238872528, 
-0.793880224227905, NaN, -0.793746829032898, -0.793708860874176, 
-0.793647706508636, NaN, NaN, NaN, -0.793846964836121, -0.793764173984528, 
-0.793659150600433, -0.639408528804779, NaN, NaN, -0.639397382736206, 
-0.63939756155014, -0.639605164527893, NaN, -0.639444351196289, 
-0.63939505815506, -0.639289438724518, NaN, NaN, NaN, -0.639537692070007, 
-0.639423429965973, -0.63926237821579, -0.567462205886841, NaN, 
NaN, NaN, -0.567524492740631, NaN, NaN, -0.567518472671509, NaN, 
NaN, NaN, NaN, NaN, -0.567527711391449, NaN, NaN, -0.76900988817215, 
NaN, NaN, -0.769101619720459, -0.769054174423218, -0.769321501255035, 
NaN, -0.769179046154022, -0.769175291061401, -0.769182145595551, 
NaN, NaN, NaN, -0.769531965255737, -0.769078016281128, -0.769262313842773, 
NaN, NaN, NaN, NaN, -0.0669489949941635, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, -0.0665916055440903, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, 0.425303876399994, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN), .Dim = c(16L, 16L, 2L))
CCO_lag<-structure(c(0, NaN, NaN, NaN, 0, 0, NaN, 0, 1, 0, NaN, NaN, NaN, 
1, 0, 0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, -3, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 5, NaN, 5, -3, NaN, NaN, 
-3, -3, -3, NaN, -3, -3, -3, NaN, NaN, NaN, -3, -3, -3, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, -1, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, -3, NaN, NaN, -3, -3, -3, NaN, -3, -3, -3, NaN, NaN, 
NaN, -3, -3, -3, -4, NaN, NaN, NaN, -4, -4, NaN, -4, -4, -4, 
NaN, NaN, NaN, -4, NaN, NaN, 0, NaN, NaN, NaN, NaN, 0, NaN, 0, 
0, 0, NaN, NaN, NaN, NaN, 0, 0, 0, NaN, NaN, NaN, NaN, NaN, NaN, 
0, 0, 0, NaN, NaN, NaN, 0, 0, NaN, 0, NaN, NaN, 1, 0, 1, NaN, 
0, 1, 1, NaN, NaN, NaN, 1, 0, 1, -2, NaN, NaN, -2, -2, -2, NaN, 
-2, -2, -1, NaN, NaN, NaN, -2, -2, -2, 0, NaN, NaN, NaN, 0.5, 
NaN, NaN, 0.5, NaN, NaN, NaN, NaN, NaN, 0.5, NaN, NaN, 1, NaN, 
NaN, 1, 1, 1, NaN, 1, 1, 1, NaN, NaN, NaN, 1, 1, 1, NaN, NaN, 
NaN, NaN, 0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.5, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, 0, NaN, 0, 0, 0, NaN, 
NaN, NaN, 0, 0, 0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, -4, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 5, NaN, 5, 
-2, NaN, NaN, -2, -2, -2, NaN, -2, -2, -2, NaN, NaN, NaN, -2, 
-2, -2, NaN, NaN, NaN, NaN, NaN, NaN, NaN, -2, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, -2, NaN, NaN, -2, -2, -2, NaN, -2, -2, 
-2, NaN, NaN, NaN, -2, -2, -2, -2, NaN, NaN, NaN, -2, -2, NaN, 
-2, -2, -2, NaN, NaN, NaN, -2, NaN, NaN, -1, NaN, NaN, NaN, NaN, 
-1, NaN, -1, -1, -1, NaN, NaN, NaN, NaN, -1, -1, -1, NaN, NaN, 
NaN, NaN, NaN, NaN, -1, -1, -1, NaN, NaN, NaN, -1, -1, NaN, 0, 
NaN, NaN, 0, 0, 0, NaN, 0, 0, 0, NaN, NaN, NaN, 0, 0, 0, -3, 
NaN, NaN, -3, -3, -3, NaN, -3, -3, -2, NaN, NaN, NaN, -3, -3, 
-3, 0, NaN, NaN, NaN, 0, NaN, NaN, 0, NaN, NaN, NaN, NaN, NaN, 
0, NaN, NaN, 0, NaN, NaN, 0, 0, 0, NaN, 0, 0, 0, NaN, NaN, NaN, 
0, 0, 0, NaN, NaN, NaN, NaN, 0, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, 0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
0, NaN, NaN, NaN, NaN, NaN, NaN, NaN), .Dim = c(16L, 16L, 2L))

Image Output

Upvotes: 0

Views: 157

Answers (1)

teunbrand
teunbrand

Reputation: 37933

You could loop along the desired dimension of your array by using lapply(seq_len(dim(my_array)[n]), ...), wherein n is your dimension of interest.

If you then use function(i) {...} inside the lapply() and put the i at the correct spot in the subsetting operation, it should pick out the appropriate data.

If the last line of the function outputs a ggplot object, it automatically gets saved in a list. Simplified example below:

library(ggplot2)

CCO<- array(rnorm(prod(16, 2, 1, 21)), c(16, 2, 1, 21))
CCO_lag <- array(rnorm(prod(16, 2, 1, 21)), c(16, 2, 1, 21))

plots <- lapply(seq_len(dim(CCO)[4]), function(i) {
  lag_mat = matrix(CCO_lag[, , 1,i], 16)
  r_mat = matrix(CCO[, , 1,i], 16)
  row = c(row(lag_mat))
  col = c(col(lag_mat)) 
  dd = data.frame( lag = c(lag_mat), r = c(r_mat), row, col ) 
  
  ggplot(dd, aes(x = row, y = col)) +
    geom_point(alpha = 1.5, stroke = 2.5)
})

# Just to show plots come out
patchwork::wrap_plots(plots)

Created on 2021-01-07 by the reprex package (v0.3.0)

Upvotes: 2

Related Questions