R:使用corrplot通过圆圈的大小和颜色将两个变量(例如相关性和p值)可视化

R:使用corrplot通过圆圈的大小和颜色将两个变量(例如相关性和p值)可视化,r,r-corrplot,R,R Corrplot,我正在尝试使用corrplot重新创建某人的图像。这是我试图重新创建的原始图像: 我使用以下R代码: corrplot(as.matrix(rgs), method="circle", type="upper", col=brewer.pal(n=8, name="PuOr"), tl.col="black", tl.srt=45, p.mat = as.matrix(pva

我正在尝试使用corrplot重新创建某人的图像。这是我试图重新创建的原始图像:

我使用以下R代码:

corrplot(as.matrix(rgs), 
         method="circle", 
         type="upper", 
         col=brewer.pal(n=8, name="PuOr"), 
         tl.col="black", 
         tl.srt=45, 
         p.mat = as.matrix(pvalues), 
         sig.level = 0.05, 
         insig = "blank")
这就给了我:


我的问题是,在我的绘图中,圆圈的颜色和大小是基于相关性的,但在上面的原始图像中,圆圈的颜色是基于相关性的,而圆圈的大小是基于p值的。我将p值放在一个称为pvalues的不同数据框中(我实际上在上面的代码中使用它来确定哪些圆应该显示,哪些不应该显示在底部的3行中)。我的问题是:如何使颜色和大小像原始图像中那样依赖于两个不同的变量?使用corrplot也可以吗?

也许此人使用了正在开发的软件包>;
ggcor
。如果您这样做:

install.packages("devtools")
devtools::install_github("houyunhuang/ggcor")

library(ggplot2)
library(ggcor)

quickcor(fortify_cor(mtcars,cor.test = T), type = "upper") + 
  geom_circle2(aes(fill = r,r0 = p.value))

您可以使大小随p值而变化

fortify_cor(mtcars,cor.test = T)
创建具有p值的相关性表

# A tibble: 121 x 8
   .row.names .col.names      r  p.value upper.ci lower.ci .row.id .col.id
 * <chr>      <chr>       <dbl>    <dbl>    <dbl>    <dbl>   <int>   <int>
 1 mpg        mpg         1     0.          1       1           11       1
 2 cyl        mpg        -0.852 6.11e-10   -0.716  -0.926       10       1
 3 disp       mpg        -0.848 9.38e-10   -0.708  -0.923        9       1
 4 hp         mpg        -0.776 1.79e- 7   -0.586  -0.885        8       1
 5 drat       mpg         0.681 1.78e- 5    0.832   0.436        7       1
 6 wt         mpg        -0.868 1.29e-10   -0.744  -0.934        6       1
 7 qsec       mpg         0.419 1.71e- 2    0.670   0.0820       5       1
 8 vs         mpg         0.664 3.42e- 5    0.822   0.410        4       1
 9 am         mpg         0.600 2.85e- 4    0.784   0.318        3       1
10 gear       mpg         0.480 5.40e- 3    0.710   0.158        2       1
#一个tible:121 x 8
.row.NAME.col.NAME r p.value upper.ci lower.ci.row.id.col.id
*                                
每加仑1英里10英里。1       1           11       1
2缸mpg-0.852 6.11e-10-0.716-0.926 10 1
3显示mpg-0.848 9.38e-10-0.708-0.923 9 1
4马力mpg-0.776 1.79e-7-0.586-0.885 8 1
5微升0.6811.78e-50.8320.436 7 1
6重量mpg-0.8681.29e-10-0.744-0.9346 1
7 qsec mpg 0.419 1.71e-20.670 0.0820 5 1
8对mpg 0.664 3.42e-50.822 0.410 4 1
上午9时mpg 0.600 2.85e-40.784 0.318 3 1
10档mpg 0.480 5.40e-3 0.710 0.158 2 1

除非你稍微修改一下,否则用
corrplot
,你想要的似乎是不可能的。我只是添加了一个新参数
size\u vector
,用于绘制圆。有关更改的行,请参见

# install the hacked version
devtools::install_github("johannes-titz/corrplot@size_parameter")
library(corrplot)
data(mtcars)
M <- cor(mtcars)
# get p values
p_vals_mat <- cor.mtest(mtcars)$p
corrplot(M, size_vector = 1-as.numeric(p_vals_mat))
这将稍微改变圆的大小:

corrplot(M, size_vector = as.numeric(transform_p((p_vals_mat))))

同样,我不推荐它,但它应该更接近原始的数字

如果只需要上三角,请仅传递上三角的p值:

upper_tri <- p_vals_mat[upper.tri(p_vals_mat, diag = T)]
corrplot(M, size_vector = transform_p(upper_tri), type = "upper")

upper\u tri如果你能让你的例子重现,那会很有帮助。什么是rgs,p值是从哪里来的。@JBGruber图表看起来像是从哪里来的,这里还有一些可下载的数据集。如果OP给我们一些样本数据会容易得多。请给出数据,看我得出了相同的结论。但是,最好使用临时覆盖函数中的行的包装函数,而不是重新安装包。查看
unlockBinding
以允许访问该功能,并使用
body(corrplot)
进行更改。在退出包装器之前,您可以将其重新更改。这太棒了,非常感谢!我同意你的建议,我还将生成一个图,该图不会像那样可视化p值,但我也需要这个图,以便进行比较。我在您的解决方案中只剩下一个问题,即,如果我使用type=“upper”选项,我会收到以下错误消息:“符号错误(Pos,add=TRUE,inches=FALSE,circles=asp\u rescale\u factor*:x/y/参数长度不匹配”.知道这是为什么吗?@Allan:谢谢!我想知道这是否可行,但最终我更容易将一个新版本上传到github。实际上,该包应该像以前一样工作。我添加了一个条件来检查新参数是否为null。如果是,函数将使用圆半径的相关性(与往常一样)。否则,它将使用手动定义的大小。抱歉,我没有时间尝试你的建议,但听起来很好!@Abdel:这是意料之中的,因为
upper
选项需要更少的向量大小元素。只需传递p值矩阵的上三角:
corrplot(M,size\u vector=p\u vals\u mat[upper.tri](p\u vals\u mat,diag=T)],type=“upper”)
您好,我正在尝试使用此解决方案,但一直遇到安装错误错误错误:未能从GitHub安装“corrplot”:(从警告转换而来)安装程序包“/var/folders/1m/1pbv4y0158b1108zl0vwcnxm0000gn/T//RtmpmkKVPd/file148b67086f13a/corrplot_0.85.tar.gz”的退出状态为非零。我在尝试安装此程序包时出错,显示HTTP错误,未找到。您能帮忙吗?文件是否已从该存储库中移动?我不知道。请尝试联系程序包维护者:
upper_tri <- p_vals_mat[upper.tri(p_vals_mat, diag = T)]
corrplot(M, size_vector = transform_p(upper_tri), type = "upper")