You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:57:29