使用ggplot2为直方图添加背景矩形时直方图未显示的问题求助
问题分析与解决方案
我帮你找到了两个核心问题,咱们一步步修复:
1. SNP位置数据生成错误
你循环生成SNP_positions的时候,错误地用了chr = chr(这里的chr是整个1:11的向量),导致每一行的chr列都包含所有染色体编号,数据框结构完全混乱,这是直方图不显示的根本原因。
另外,循环中反复rbind效率很低,建议用lapply批量生成数据再合并:
chr = 1:11 nb_SNP = 1000 # 批量生成每个染色体的SNP位置,再合并成数据框 SNP_positions <- do.call(rbind, lapply(chr, function(c) { data.frame( chr = c, # 这里用循环变量c,对应当前染色体编号 position = sample(1:5000000, nb_SNP, replace = TRUE) ) }))
2. 绘图细节优化(让背景矩形和直方图匹配)
虽然你的矩形数据df_chr没问题,但绘图时需要两个调整来让背景和直方图协调:
- 给
geom_rect加上inherit.aes=FALSE,避免它继承主图层的SNP数据; - 开启
facet_wrap的scales="free_x",让每个染色体的x轴自适应其长度; - 可以隐藏填充图例,因为分面已经显示了染色体编号,避免重复。
修正后的绘图代码:
library(ggplot2) MarkerDensity <- ggplot(SNP_positions) + # 绘制染色体背景矩形,inherit.aes=FALSE确保用df_chr的数据 geom_rect(data = df_chr, aes(xmin = xmin, xmax = xmax, fill = as.factor(chr)), ymin = -Inf, ymax = Inf, alpha = 0.5, inherit.aes = FALSE) + # 绘制直方图,加上边框让柱子更清晰 geom_histogram(aes(x=position), binwidth=1000, color="black", fill="white") + # 分面并自适应x轴 facet_wrap(~chr, ncol=3, scales="free_x") + ggtitle("SNP density over E. grandis genome") + xlab("Genomic position (1 Kb)") + ylab("Number of SNPs") + theme_bw() + # 隐藏填充图例,避免与分面重复 scale_fill_discrete(guide="none") plot(MarkerDensity)
运行修正后的代码,你就能看到每个染色体的直方图和对应的背景色块了。
内容的提问来源于stack exchange,提问作者Ehones




