仅更改ggplot2中热图上三角矩阵的颜色

Gab*_*gro 3 r matrix heatmap ggplot2

我有一个融化的矩阵,我想将其绘制为热图,相关系数位于下部矩阵中,P 值位于上部三角形中

> melted_corfinal
     Var1   Var2 value
1     iHS    iHS  1.00
2     nSL    iHS  0.89
3  XP-EHH    iHS  0.01
4     PBS    iHS  0.00
5     iHS    nSL  0.00
6     nSL    nSL  1.00
7  XP-EHH    nSL  0.01
8     PBS    nSL  0.00
9     iHS XP-EHH  0.00
10    nSL XP-EHH  0.00
11 XP-EHH XP-EHH  1.00
12    PBS XP-EHH  0.18
13    iHS    PBS  0.90
14    nSL    PBS  0.41
15 XP-EHH    PBS  0.00
16    PBS    PBS  1.00
Run Code Online (Sandbox Code Playgroud)

但是,我找不到一种方法来仅更改上三角矩阵的颜色,同时保留值。我希望它只是白色(背景)。

这是我迄今为止提出的代码:

p <- ggplot(melted_corfinal, aes(Var2, Var1)) +
  geom_tile(aes(fill = value)) + 
  geom_text(aes(label = round(value, 2))) +
  scale_fill_continuous("",limits=c(0, 1), breaks=seq(0,1,by=0.2),low = "#fee8c8", high = "#e34a33") + 
  theme_light() + theme(legend.position="none",axis.title.x = element_blank(),axis.title.y = element_blank()) +
  guides(fill = guide_colorbar(barwidth = 20)) +
  ylim(rev(levels(melted_corfinal$Var1))) + xlim(levels(melted_corfinal$Var2))

plot(p) 
Run Code Online (Sandbox Code Playgroud)

另外,我仍然希望表中显示 2 位小数,但当它们为零时,它们会“四舍五入”。输出:

structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("iHS", "nSL", 
"XP-EHH", "PBS"), class = "factor"), Var2 = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("iHS", 
"nSL", "XP-EHH", "PBS"), class = "factor"), value = c(1, 0.89, 
0.01, 0, 0, 1, 0.01, 0, 0, 0, 1, 0.18, 0.9, 0.41, 0, 1)), .Names = c("Var1", 
"Var2", "value"), row.names = c(NA, -16L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

Djo*_*ork 5

好的,首先我将您提供的数据转换回常规未熔化矩阵,这样我就可以轻松地将上三角形设置为 NA。我这样做是用dcast. 该矩阵已经是对角线和下三角上的相关性以及上三角上的 p 值的组合。

melted_corfinal <- structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), 
                                                   .Label = c("iHS", "nSL", "XP-EHH", "PBS"), class = "factor"), 
                                  Var2 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), 
                                                   .Label = c("iHS", "nSL", "XP-EHH", "PBS"), class = "factor"), 
                                  value = c(1, 0.89, 0.01, 0, 0, 1, 0.01, 0, 0, 0, 1, 0.18, 0.9, 0.41, 0, 1)), 
                             .Names = c("Var1", "Var2", "value"), row.names = c(NA, -16L), class = "data.frame")

cor_pval <- dcast(melted_corfinal, Var1~Var2)[, -1]
# Set to NA upper triangle excluding diagonal
cor_pval[upper.tri(cor_pval, diag=F)] <- NA 
Run Code Online (Sandbox Code Playgroud)

然后我将其融化并添加为第二个值melted_corfinal

cor_pval_col <- melt(cor_pval)
melted_corfinal$value2 <- cor_pval_col$value
melted_corfinal
Run Code Online (Sandbox Code Playgroud)

现在我们按照您的方式进行绘图,但是geom_tile我们使用value2NA 来表示 p 值。然后我们就na.value="white"出发了scale_fill_continuous

最后为了得到 0 的 2 个符号数字,我使用了format

p <- ggplot(melted_corfinal, aes(Var2, Var1)) +
  geom_tile(aes(fill = value2)) +
  scale_fill_continuous("",limits=c(0, 1), breaks=seq(0,1,by=0.2), low = "#fee8c8", high = "#e34a33", na.value = "white") + 
  geom_text(aes(label = format(value, nsmall=2))) +
  theme_light() + theme(legend.position="none",axis.title.x = element_blank(),axis.title.y = element_blank()) +
  guides(fill = guide_colorbar(barwidth = 20)) +
  ylim(rev(levels(melted_corfinal$Var1))) + xlim(levels(melted_corfinal$Var2))
p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 您还可以使用 subset(melted_corfinal, as.integer(Var1) &gt;= as.integer(Var2)) 排除上三角形,并直接在几何中使用它。这更简洁,仅使用基本 R (3认同)
  • 我本来想用更简单的子集来支持你的答案,但你删除了它(它在我面前消失了)!谢谢你的建议,这个建议很好:) (2认同)