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

使用ggplot绘制曼哈顿图无法按染色体为散点上色问题求助

问题原因排查

  • 颜色映射位置错误:你把color=as.factor(chromosome)写在了aes()函数的外部,ggplot仅会将aes()内部的参数识别为和数据绑定的变量映射,外部传入的color会被判定为全局静态颜色设置,自然无法按染色体分组上色。
  • 颜色向量生成逻辑错误:scale_color_manual中values = rep(c("#276FBF", "#183059"), unique(length(axisdf$chromosome)))的写法无效:length(axisdf$chromosome)返回的是单个数值,unique()不会产生任何效果,最终生成的颜色向量长度和染色体数量不匹配。
  • 可选优化:x轴标签参数拼写错误:scale_x_continuous中设置轴标签的参数为labels,你当前写的label少了末尾的s,会导致x轴染色体标签无法正常显示。

修正后的完整代码

library(tidyverse)
library(vroom)

# 过滤过小的-log10 p值,避免绘制大量无意义点,小样本测试时设为0即可
min_p <- 0.0

# 读取数据,处理AvsDD列的字符、转数值、按阈值过滤
brassica_df2 <- vroom("manhattan_practice_data.txt", col_names = c("chromosome", "position", "num_SNPs", "prop_SNPs_coverage", "min_coverage", "AvsDD", "AvsWD", "DDvsWD"))
brassica_df2 <- as.data.frame(brassica_df2)
brassica_df2$AvsDD <- gsub("1:2=","",as.character(brassica_df2$AvsDD))
brassica_df2$AvsDD <- as.numeric(brassica_df2$AvsDD)
brassica_df2 <- filter(brassica_df2, AvsDD > min_p)

# 设置显著性阈值
sig_cut <- -log10(1)

# 设置y轴范围
ylim <- (max(brassica_df2$AvsDD) + 2)

# 计算x轴染色体标签的居中位置
axisdf <- as.data.frame(brassica_df2 %>% group_by(chromosome) %>% summarize(center=( max(position) + min(position) ) / 2 ))

# 绘制曼哈顿图,修正核心错误
manhplot <- ggplot(data = filter(brassica_df2, AvsDD > sig_cut), aes(x=position, y=AvsDD, color=as.factor(chromosome))) +
  geom_point(alpha = 0.8) +
  scale_x_continuous(labels = axisdf$chromosome, breaks= axisdf$center) +
  scale_color_manual(values = rep(c("#276FBF", "#183059"), length.out = nrow(axisdf))) +
  geom_hline(yintercept = sig_cut, lty = 2) +
  ylab("-log10 p value") +
  ylim(c(0,ylim)) +
  theme_classic() +
  theme(legend.position = "none")
print(manhplot)

内容的提问来源于stack exchange,提问作者steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:48:02