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")
我正在尝试使用 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")