【问题标题】:R: using corrplot to visualize two variables (e.g., correlation and p-value) using the size and colour of the circlesR:使用 corrplot 使用圆圈的大小和颜色来可视化两个变量(例如,相关性和 p 值)
【发布时间】:2020-06-10 02:47:54
【问题描述】:

我正在尝试使用 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 吗?

【问题讨论】:

  • 如果您可以使您的示例可重现,那将会很有帮助。什么是 rgs,你从哪里得到 p 值。
  • @JBGruber 看起来图表来自this scientific article,那里还有一些可下载的数据集。如果 OP 给我们一些样本数据会容易得多。
  • 请给数据,见minimal reproducible example

标签: r r-corrplot


【解决方案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")

【讨论】:

  • 我得出了同样的结论。但是,最好有一个包装函数来临时覆盖函数中的行,而不是重新安装包。查看unlockBinding 以允许访问该功能并使用body(corrplot) 进行更改。然后,您可以在退出包装器之前将其更改回来。
  • 这太好了,非常感谢!我同意您的建议,我还将生成一个不会像那样可视化 p 值的图,但我也需要这个图来进行比较。我的解决方案中只剩下一个问题,即,如果我使用选项 type="upper",我会收到以下错误消息:“符号错误(Pos, add = TRUE, inches = FALSE, circles = asp_rescale_factor * : x/y/参数长度不匹配”。知道这是为什么吗?
  • @Allan:谢谢!我想知道这是否可能,但最后我更容易将小说版本上传到 github。实际上,该软件包应该像以前一样工作。我添加了一个条件来检查新参数是否为空。如果是,该函数使用圆半径的相关性(像往常一样)。否则,它使用手动定义的大小。抱歉,我没有时间尝试您的建议,但听起来很不错!
  • @Abdel:这是意料之中的,因为upper 选项需要较少的vector_size 元素。只需传递p值矩阵的上三角:corrplot(M, size_vector = p_vals_mat[upper.tri(p_vals_mat, diag = T)], type = "upper")
  • 您好,我正在尝试使用此解决方案,但我一直遇到安装错误错误:无法从 GitHub 安装“corrplot”:(从警告转换)安装包 '/var/folders/1m /1pbv4y0158b1108zl0vwcnxm0000gn/T//RtmpmkKVPd/file148b67086f13a/corrplot_0.85.tar.gz'有非零退出状态
【解决方案2】:

也许这个人使用了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

【讨论】:

  • 我在尝试安装此软件包时遇到错误,提示 HTTP 错误,未找到。你能帮忙吗?文件是否已从该存储库中移出?
  • 我不知道。尝试联系packge维护者:rdrr.io/github/houyunhuang/ggcor
猜你喜欢
  • 2021-01-21
  • 2018-01-12
  • 2020-07-05
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 2022-12-06
相关资源
最近更新 更多