You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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_wrapscales="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

火山引擎 最新活动