如何在ggplot中按非绘图列x对Y轴Mutations降序排序,并添加基于mab列的侧边注释?
当然可行!咱们一步步来解决你的两个需求:
1. 按
x列降序排列Y轴的Mutations 要实现这个,核心是把Mutations转换成有序因子,让它的水平(levels)按照x的降序规则排列。因为每个Mutations对应唯一的x值(比如所有P9开头的突变x都是9,S12P的x是12等),我们可以先提取每个突变对应的x值,再按x从大到小排序突变,最后设置因子的levels。
这里提供两种清晰的实现方式:
方式一:提前整理数据(推荐,逻辑更直观)
用dplyr分组提取每个突变的x值,再排序生成有序因子:
library(dplyr) library(ggplot2) # 生成按x降序排列的突变列表 sorted_mutations <- test %>% distinct(Mutations, x) %>% arrange(desc(x), Mutations) %>% # 先按x降序,再按突变名称排序(可选) pull(Mutations) # 将Mutations转换为有序因子 test$Mutations <- factor(test$Mutations, levels = sorted_mutations)
之后直接用你原来的绘图代码,Y轴就会自动按x降序排列了。
方式二:直接在ggplot中设置
如果不想修改原始数据,可以在aes(y = ...)里直接指定因子的levels:
# 先生成排序后的突变列表(和上面的sorted_mutations一样) p1 <- ggplot(test, aes(x = epi_week, y = factor(Mutations, levels = sorted_mutations), fill = n)) + # 后续绘图代码保持不变...
2. 添加基于
mab列的侧边注释 从你的数据看,mab列当前全为1,不过假设后续会有不同值,我们可以在图表右侧(或左侧)添加每个突变对应的mab值注释。最简单的方法是用geom_text,把注释放在x轴最大值的外侧:
# 获取x轴的最大epi_week值,确定注释的位置 max_epi <- max(test$epi_week) # 在原有绘图代码基础上添加注释图层 p1_annotated <- p1 + geom_text(data = distinct(test, Mutations, mab), aes(x = max_epi + 1, y = Mutations, label = paste("Mab:", mab)), hjust = 0, size = 3, color = "black") + # 调整x轴范围,给注释留出空间 xlim(min(test$epi_week), max_epi + 3)
如果mab是分类变量,还可以给不同值设置不同颜色,比如:
geom_text(data = distinct(test, Mutations, mab), aes(x = max_epi + 1, y = Mutations, label = mab, color = factor(mab)), hjust = 0, size = 3) + scale_color_manual(values = c("1" = "darkblue", "2" = "darkred")) # 按需设置颜色
完整整合代码
把两个需求结合起来的完整代码如下:
library(dplyr) library(ggplot2) # 处理突变排序 sorted_mutations <- test %>% distinct(Mutations, x) %>% arrange(desc(x), Mutations) %>% pull(Mutations) test$Mutations <- factor(test$Mutations, levels = sorted_mutations) max_epi <- max(test$epi_week) # 绘制主图 p1 <- ggplot(test, aes(x = epi_week, y = Mutations, fill = n))+ geom_tile() + coord_equal() + scale_fill_gradient(trans = "log",low="white", high="darkgreen", guide_legend(title = "Percentage (%)", title.position = "top"), labels = function(x) sprintf("%.2f", x)) + # 添加侧边mab注释 geom_text(data = distinct(test, Mutations, mab), aes(x = max_epi + 1, y = Mutations, label = paste("Mab:", mab)), hjust = 0, size = 3, color = "black") + xlim(min(test$epi_week), max_epi + 3) + theme( panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black"), axis.text.y = element_text( hjust = 1, size=5,color="black") ) # 添加置信度边框图层 p1 + geom_tile(data=test, aes(colour=factor(support, c(1,2,3)), size=factor(support,c(1,2,3))), alpha=0) + scale_colour_manual("Confidence", values=c("white", "blue4","red")) + scale_size_manual("Confidence", values=c(0,0.2,0.2))
这样你的Y轴就会按x的降序排列,同时在图表右侧显示每个突变对应的mab值啦!
内容的提问来源于stack exchange,提问作者ale
相关产品推荐
相关产品推荐

