【问题标题】:Looping through a matrix and plotting in R循环遍历矩阵并在 R 中绘图
【发布时间】:2021-04-13 14:33:24
【问题描述】:

我在 R lag_matr_mat 中有两个矩阵,并且都有维度 16x16x3x2x2

我有以下代码用于在 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)) 

我遇到的问题是我需要遍历最后一个维度。我进行了更多分析,而不是矩阵的最后一个维度是2,现在是21。我曾经只使用过两个脚本,一个是我绘制的(即不同脚本中的每个维度 - 我知道效率不高)。

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

另一个是

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

但现在我当然不能有 21 个脚本,但我不确定如何在 R 中循环和绘图。

谁能帮我解决这个问题?所以我可以遍历最后一个维度并使用 ggplot 绘制 21 个数字?

谢谢!

这是数据,我复制了一个较小的矩阵,使得两个矩阵都不是维度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))

【问题讨论】:

  • 是的,对不起,我只是在想……我会想办法上传我的数据。
  • 是的,只是这样做了,在问题的最后,我提供了一个较小的 CCO 和 CCO_lag 样本,并附上了它会产生的数字。

标签: r ggplot2 matrix plot


【解决方案1】:

您可以使用lapply(seq_len(dim(my_array)[n]), ...) 沿着数组的所需维度循环,其中n 是您感兴趣的维度。

如果您随后在lapply() 中使用function(i) {...} 并将i 放在子集操作中的正确位置,它应该会挑选出适当的数据。

如果函数的最后一行输出一个 ggplot 对象,它会自动保存在一个列表中。下面的简化示例:

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)

reprex package (v0.3.0) 于 2021-01-07 创建

【讨论】:

  • 谢谢!我只是想了解我会在 dim(CCO)[HERE] 中放入什么来一次性获得所有 21 个地块?会是 1:21 而不是你的 4? plots &lt;- lapply(seq_len(dim(CCO)[4]), function(i){
  • 维度的编号。例如 [1] 将是行,[2] 列,[3] 第 3 个数组切片,[4] 第 4 个数组切片等。您提到您的数组是 16x16x3x2x2 所以 [1] 将是 16,[2] 将是16,[3] 为 3,[4] 为 2,[5] 为 2。
  • 哦!明白了,让我试一试!
  • 我只是假设它是 [4],因为您改变了单行代码块中的第 4 个子集元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2020-05-30
相关资源
最近更新 更多