使用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
相关产品推荐
相关产品推荐

