R语言 向使用ggplot创建的相关性热图的轴添加注解条而不是文本

lbsnaicq  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(113)

嗨谢谢你的阅读和潜在的帮助!
我尝试使用以下代码注解使用ggplot生成的相关热图的x轴和y轴:

# Gen ggplot
ggplot(cor.df, aes(x, y, fill = correlation)) +
  geom_tile(#color = "black") + theme_bw() + theme(axis.text.x = element_text(angle=70,vjust = 1, hjust=1)) + scale_fill_gradient2(low = "dodgerblue4", high = "red4", mid = "white", 
                                    midpoint = 0.5, limit = c(0,1), space = "Lab", 
                                    name="Pearson\nCorrelation")

Heatmap
然而,X轴和y轴是具有各种元数据的细胞,诸如起源、疾病、细胞类型等(为了简洁起见,说存在这3种元数据类型)。
上面的cor.df是一个数据框架:

# Example dat:
                                    x                       y  correlation
1              cell1_disease1_origin1  cell1_disease1_origin1  0.5
2              cell2_disease1_origin1  cell2_disease1_origin1  0.5
3              cell3_disease1_origin2  cell3_disease1_origin2  0.5
4              cell4_disease2_origin2  cell4_disease2_origin2  0.5
5              cell5_disease2_origin3  cell5_disease2_origin3  0.5

我们的目标是向ggplot对象添加一些编码,以便可以在x轴和y轴上添加注解条,例如在y轴上观察到的内容:
example heatmap
或者像这里所示的那样:
heatmap with annotations on x and y axis
但是,我希望3种类型的元数据有3个相互堆叠的注解标签,而不是只有一个注解。我知道元数据可以被添加到cor.df中,然后元数据和绘图数据之间的链接可以被用于A。创建热图,然后在y轴和x轴上B注解条层?
我提前道歉,如果这是不是reprex足够的…随时摧毁我,如果它不是…谢谢你的帮助!
P.S不想使用complexheatmap或heatmap,我想学习使用原生ggplot动词的解决方案,因为这是诚实地学习和实现其他想法的最佳方式,而不是永远导航包(毫无疑问,这是有用的)。
万分感谢!!!
已经试过了facet_wrap()annotation,但不起作用。

wfsdck30

wfsdck301#

包{cowplot}和{patchwork}值得一试。为了快速修复,您还可以滚动自己的辅助对象几何体:

## Example data (pseudo correlation matrix in long format):
corr_mat <- 
  expand.grid(LETTERS[1:3], LETTERS[1:3]) |>
  cbind(cor = rnorm(9))
}
+ > corr_mat
  Var1 Var2          cor
1    A    A -0.267253341
2    B    A  0.640494120
3    C    A -0.430569260
## ...

一次性几何形状:

geom_hlabel <- function(x = 0, xend = 0, y = 0, label = 'label'){
  list(
    geom_segment(aes(x = x, xend = xend,
                     y = y, yend = y), 
                 arrow = arrow(ends = 'both', length = unit(2, 'pt'))),
    geom_label(aes(x = x + abs(xend - x)/2, y = y, label = label))
  )
}

在ggplot中使用:

corr_mat |>
  ggplot() + 
  geom_tile(aes(Var1, Var2, fill = cor)) +
  geom_hlabel(x = .5, xend = 2.5, y = 0, label = 'range of origin 1') +
  geom_hlabel(x = 1.5, xend = 3.5, y = - .2 , label = 'disease XY here') +
  coord_cartesian(clip = 'off') ## turn clipping off!

相关问题