使用ggplot2 geom_tile绘制互斥/共现图时排序轴标签致异常
解决ggplot2 geom_tile绘制染色体臂共现/互斥三角图的错位问题
我来帮你搞定这个三角图错位的问题!你的核心问题在于x轴和y轴的刻度排序没有完全对应,加上没有过滤掉非三角区域的配对,导致tile位置混乱。下面是一步步的修复方案:
1. 统一轴的排序规则
首先,我们需要让x轴和y轴使用完全一致的事件排序,只是y轴反转显示,这样才能保证每个tile的位置准确对应:
library(gtools) library(dplyr) library(ggplot2) # 读取你的数据集(假设你已经加载了cooccur.table) # cooccur.table <- read.table("你的数据路径", header = T, stringsAsFactors = F) # 对所有事件(Event1和Event2的并集)进行混合排序,得到统一的顺序 all_events <- mixedsort(unique(c(cooccur.table$Event1, cooccur.table$Event2))) # 设置x轴为升序的因子 cooccur.table$Event1 <- factor(cooccur.table$Event1, levels = all_events) # 设置y轴为降序的因子(反转all_events,保证和x轴刻度一一对应) cooccur.table$Event2 <- factor(cooccur.table$Event2, levels = rev(all_events))
2. 过滤出三角区域的配对
因为你要的是三角图,我们需要保留非重复的配对区域(比如下三角或上三角),避免重复显示对称的tile:
# 给每个事件分配排序索引,方便筛选三角区域 event_order <- tibble(Event = all_events, order = 1:length(all_events)) # 合并索引到原数据集,获取每个事件的排序位置 cooccur.table <- cooccur.table %>% left_join(event_order, by = c("Event1" = "Event")) %>% rename(order1 = order) %>% left_join(event_order, by = c("Event2" = "Event")) %>% rename(order2 = order) # 筛选下三角区域(根据需求可改成order1 < order2保留上三角) cooccur_tri <- cooccur.table %>% filter(order1 > order2)
3. 绘制正确的三角图
现在用过滤后的数据集绘图,就能得到对齐准确的三角热图了:
ggplot(cooccur_tri, aes(x = Event1, y = Event2, fill = label)) + geom_tile(colour = "black") + coord_equal() + # 自定义颜色(保留你的原设置,可按需调整) scale_fill_manual(values = c("#08d9d6", "#e84a5f", "#ffffff"), labels = c("共现", "互斥", "无")) + # 调整主题,优化显示效果 theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1, size = 8), axis.text.y = element_text(hjust = 1, size = 8), legend.position = "right", axis.line = element_line(size = 0.2), axis.ticks = element_blank(), panel.background = element_blank()) + labs(x = "染色体臂事件1", y = "染色体臂事件2", fill = "关系类型")
关键说明
- 统一x/y轴的排序是解决错位的核心:只有两个轴的刻度一一对应,tile才能准确落在对应的交叉位置。
- 筛选三角区域可以避免重复显示对称配对(比如A-B和B-A),让图更简洁清晰。
- 如果你的数据里没有对称配对,也可以跳过过滤步骤,直接用修正排序后的原数据集绘图。
内容的提问来源于stack exchange,提问作者Mateo Kee
相关产品推荐
相关产品推荐

