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()
问题根源
- 原代码中
chromosome列混合了数值(如3、17)和字符(如"X"),数据框会自动将该列转为因子,可能引发分组逻辑异常。 - 默认
facet_grid()使用全局统一的x轴范围,不同染色体的基因组位置跨度差异极大(如染色体15在20M区间,染色体3在66M区间),小跨度区域被压缩至几乎不可见,最终仅显示了与全局x轴范围匹配的两个区域。
内容的提问来源于stack exchange,提问作者Fiona
相关产品推荐
相关产品推荐

