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

geom_rect()未绘制全部数据点:拷贝数频率图绘制求助

解决ggplot2中geom_rect结合facet_grid无法显示全部拷贝数区域的问题

我尝试用R的ggplot2包中geom_rect()和facet_grid()制作拷贝数频率图,目标是生成按染色体分面、每个区域用矩形展示拷贝数的图。我的数据包含染色体编号、区域起始/终止位置和拷贝数信息,但运行代码后仅显示2个矩形区域,数据框中其余8条数据对应的区域都没显示出来。

示例数据

chromosome    start      end cnv
1           3 66133610 66388116   1
2           4 74744759 74794523   1
3          17 41712331 41715969   1
4          17 41717742 41734644   1
5          17 41754604 41786931   1
6          17 41812680 41823213   7
7          17 41825057 41836260   3
8          15 20531856 20541800   5
9          17 41835685 41848384   3
10         15 20835372 20866314   4

问题代码

我运行的简化代码如下:

library(ggplot2)

os.sub <- data.frame("chromosome"=c(3,"X",17,17, 17, 17, 17, 15, 17, 15), 
                     "start" = c(66133610, 74744759, 41712331, 41717742, 41754604, 41812680, 41825057, 20531856, 41835685, 20835372), 
                     "end" = c(66388116, 74794523, 41715969, 41734644, 41786931, 41823213, 41836260, 20541800,41848384, 20866314),
                     "cnv"=c(1, 1, 1, 1, 1, 7, 3, 5, 3, 4))

ggplot(os.sub) + 
  geom_rect(aes_string(xmin="start",xmax="end",ymin=0, ymax="cnv"))+ 
  facet_grid(~chromosome)

修复方案

步骤说明

  • 统一染色体列类型:将chromosome列转换为字符类型,避免数值与字符混合导致的分组异常。
  • 开启分面x轴独立缩放:在facet_grid()中添加scales="free_x"参数,让每个染色体面板的x轴(基因组位置)使用独立范围,避免小跨度区域被压缩至不可见。

修复后代码

library(ggplot2)

# 统一chromosome列为字符类型,避免类型混合问题
os.sub <- data.frame(
  chromosome = as.character(c(3,"X",17,17, 17, 17, 17, 15, 17, 15)), 
  start = c(66133610, 74744759, 41712331, 41717742, 41754604, 41812680, 41825057, 20531856, 41835685, 20835372), 
  end = c(66388116, 74794523, 41715969, 41734644, 41786931, 41823213, 41836260, 20541800,41848384, 20866314),
  cnv = c(1, 1, 1, 1, 1, 7, 3, 5, 3, 4),
  stringsAsFactors = FALSE
)

ggplot(os.sub) + 
  geom_rect(aes(xmin = start, xmax = end, ymin = 0, ymax = cnv)) + 
  facet_grid(~chromosome, scales = "free_x") +
  labs(x = "基因组位置", y = "拷贝数") +
  theme_bw()

问题根源

  1. 原代码中chromosome列混合了数值(如3、17)和字符(如"X"),数据框会自动将该列转为因子,可能引发分组逻辑异常。
  2. 默认facet_grid()使用全局统一的x轴范围,不同染色体的基因组位置跨度差异极大(如染色体15在20M区间,染色体3在66M区间),小跨度区域被压缩至几乎不可见,最终仅显示了与全局x轴范围匹配的两个区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:35:28