如何使用ggplot2绘制三角形热图并仅保留上/下三角部分
你可以通过固定SFE列的因子顺序,再通过位置索引筛选行的方式实现只保留三角热图,具体操作如下:
步骤1:固定轴顺序
首先要保证x轴和y轴的SFE项顺序完全一致,我们先提取所有唯一的SFE名称,将两列都转成固定顺序的因子:
# 提取所有唯一的SFE名称 all_sfe <- unique(c(df_triheatmap$SFE_1, df_triheatmap$SFE_2)) # 固定SFE_1和SFE_2的因子顺序,保证x/y轴顺序完全匹配 df_triheatmap$SFE_1 <- factor(df_triheatmap$SFE_1, levels = all_sfe) df_triheatmap$SFE_2 <- factor(df_triheatmap$SFE_2, levels = all_sfe)
步骤2:按位置筛选数据
给每个SFE项分配对应的位置索引,按索引筛选你要保留的三角部分:
# 给两列分别添加位置索引 df_triheatmap$idx1 <- as.numeric(df_triheatmap$SFE_1) df_triheatmap$idx2 <- as.numeric(df_triheatmap$SFE_2) # 筛选保留下三角(idx1 > idx2),过滤掉上三角和对角线数据 df_tri_lower <- df_triheatmap[df_triheatmap$idx1 > df_triheatmap$idx2, ] # 如果你要保留上三角,用这行代码 # df_tri_upper <- df_triheatmap[df_triheatmap$idx1 < df_triheatmap$idx2, ] # 需要保留对角线的话,把运算符改成 >= 或者 <= 即可
步骤3:画图
直接用筛选后的数据集画图即可,你原来的画图代码不需要修改,只要把输入数据换成筛选后的数据集:
ggplot(df_tri_lower, aes(SFE_1, SFE_2, fill = overlap)) + geom_raster() + scale_fill_distiller(palette = "Spectral") + theme_minimal() + theme(panel.grid = element_blank())
可选方案:保留原始数据行数,将不需要的部分设为空白
如果你不想修改原始数据的行数,也可以把不需要展示的区域的overlap值设为NA,ggplot会自动将这部分渲染为空白:
# 把上三角区域的overlap设为NA,仅展示下三角 df_triheatmap$overlap[df_triheatmap$idx1 <= df_triheatmap$idx2] <- NA
这样直接用原始数据画图就能得到三角热图效果。
内容的提问来源于stack exchange,提问作者Lin Caijin
相关产品推荐
相关产品推荐

