我有一个包含400个变量的数据集,我用它来生成一个关联矩阵(即将每个变量相互比较)。所得矩阵具有以下结构:
然后,我使用以下命令使用corrplot包生成相关矩阵图:
library(corrplot)
corrplot(df, order = "hclust",
tl.col = "black", tl.srt = 45)
不出所料,这会产生一个非常大的可解释的数字。我希望拆分我的矩阵,然后创建单独的相关矩阵数字(一次实际上有20个变量的成对比较)。我正在努力寻找代码来帮助我拆分我的矩阵并将其插入corrplo。任何帮助都将不胜感激!
谢谢你。
一种方法是把你的相关矩阵分解,然后画出所有的子矩阵。这样做的挑战是,你要设置< code>order=,而你(显然)事先并不知道。假设你想让< code>corrplot来决定顺序,那么这里有一个方法:先绘制整个东西捕捉函数的返回值(包含顺序信息),然后拆分矩阵,绘制组件。
有用:虽然大多数绘图函数通过副作用(创建绘图,不一定返回值)运行,但某些函数返回的信息对于使用或围绕其绘图组件很有用。科普洛特
也不例外;来自 ?corrplot
:
Value:
(Invisibly) returns a 'list(corr, corrTrans, arg)'. 'corr' is a
reordered correlation matrix for plotting. 'corrPos' is a data
frame with 'xName, yName, x, y, corr' and 'p.value'(if p.mat is
not NULL) column, which x and y are the position on the
correlation matrix plot. 'arg' is a list of some corrplot() input
parameters' value. Now 'type' is in.
有了这个,我们就开始吧。我将使用< code>mtcars
>
绘制整个内容。如果这需要很长时间,或者您不希望它尝试在R的图形窗格中绘制,则取消注释png
和dev.off
,只是为了将绘图本身转储为“无”。("NUL"
是Windows的东西……我怀疑"/dev/null"
应该可以在大多数其他操作系统上运行,未经测试。)
# png("NUL")
CP <- corrplot::corrplot(M, order="hclust", tl.col="black", tl.srt=45)
# dev.off()
str(CP)
# List of 3
# $ corr : num [1:6, 1:6] 1 0.4 0.8 0.1 0.2 0.2 0.4 1 0.84 0.11 ...
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr [1:6] "var_1" "var_5" "var_6" "var_2" ...
# .. ..$ : chr [1:6] "var_1" "var_5" "var_6" "var_2" ...
# $ corrPos:'data.frame': 36 obs. of 5 variables:
# ..$ xName: chr [1:36] "var_1" "var_1" "var_1" "var_1" ...
# ..$ yName: chr [1:36] "var_1" "var_5" "var_6" "var_2" ...
# ..$ x : num [1:36] 1 1 1 1 1 1 2 2 2 2 ...
# ..$ y : num [1:36] 6 5 4 3 2 1 6 5 4 3 ...
# ..$ corr : num [1:36] 1 0.4 0.8 0.1 0.2 0.2 0.4 1 0.84 0.11 ...
# $ arg :List of 1
# ..$ type: chr "full"
< code>rownames(CP$corr)(等于< code>colnames(CP$corr))提供了列/行顺序,因此我们可以使用它们作为我们的排序(由< code>order="hclust"产生)。
M_reord <- M[rownames(CP$corr), colnames(CP$corr)]
M_reord
# var_1 var_5 var_6 var_2 var_3 var_4
# var_1 1.0 0.40 0.80 0.10 0.20 0.20
# var_5 0.4 1.00 0.84 0.11 0.05 0.25
# var_6 0.8 0.84 1.00 0.60 0.72 0.54
# var_2 0.1 0.11 0.60 1.00 0.15 0.30
# var_3 0.2 0.05 0.72 0.15 1.00 0.47
# var_4 0.2 0.25 0.54 0.30 0.47 1.00
现在我们把矩阵分开。对于这个例子,我假设你的“20”实际上是“3”。一些帮助程序对象:
grps <- (seq_len(nrow(M)) - 1) %/% 3
grps
# [1] 0 0 0 1 1 1
eg <- expand.grid(row = unique(grps), col = unique(grps))
eg
# row col
# 1 0 0
# 2 1 0
# 3 0 1
# 4 1 1
其中 eg
的行首先计算列(上-下然后从左到右),如下所示:
给定一个特定的子矩阵编号(行< code>eg),绘制它。让我们试试“2”:
subplt <- 2
rows <- which(grps == eg[subplt, "row"])
cols <- which(grps == eg[subplt, "col"])
corrplot::corrplot(M[rows, cols], tl.col="black", tl.srt=45)
如果您想要自动绘制它们(例如,在rmarkdown文档中,在< code>shiny中),那么您可以使用以下命令对它们进行循环:
for (subplt in seq_len(nrow(eg))) {
rows <- which(grps == eg[subplt, "row"])
cols <- which(grps == eg[subplt, "col"])
corrplot::corrplot(M[rows, cols], tl.col="black", tl.srt=45)
}