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

R: using corrplot to visualize two variables (e.g., correlation and p-value) using the size and colour of the circles

我正在尝试使用 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 值。我在一个名为 pvalues 的不同数据框中有 p 值(我实际上在上面的代码中使用它来确定应该显示哪些圆圈,哪些不应该显示在底部 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)

创建 table 相关性,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

corrplot 似乎无法满足您的需求,除非您稍微修改一下。我只是添加了一个新参数 size_vector ,用于绘制圆圈。有关更改的行,请参阅 https://github.com/johannes-titz/corrplot/commit/9362f6a7c2fda794b5ef8895b77f0b2ff979092a

# 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))

请注意,我使用 1-p 作为大小(小 p 值产生大圆圈)。您可以使用 0 到 1 之间的任何值作为大小。

进一步注意,在原图中,p 值和圆大小之间的关系是非线性的。所以你可能想使用一些接近这种关系的转换。

无论如何,我实际上建议不要使用此类数字。 p 值本身就有问题,但通过某种转换绘制它们对我来说意义不大。相关性的大小可能是最重要的信息,而图中并未反映这一点。这可能会造成混淆。

PS: 我懒得加图例了,不过用legend.

应该不难吧

一个小更新: p 值的转换可能是这样的:

transform_p <- function(x) {
  y <- 0.91 - (0.82) * (1 - exp(-3.82 * x))
  y
}

这会稍微改变圆圈的大小:

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")