如何让ggplot染色体覆盖度分面图的XY轴随染色体自适应?
问题描述
数据集信息
我拥有如下数据集:
> head(tab) chr start stop cov 1 chr1A 100000 200000 196.12189 2 chr1A 200000 300000 209.58797 3 chr1A 300000 400000 241.63087 4 chr1A 400000 500000 44.75814 5 chr1A 500000 600000 7.50481 6 chr1A 600000 700000 7.2191 > tail(tab) chr start stop cov 90959 chr7B 574900000 575000000 7.569640 90960 chr7B 575000000 575100000 7.895070 90961 chr7B 575100000 575200000 7.393070 90962 chr7B 575200000 575300000 7.713670 90963 chr7B 575300000 575400000 7.384180 90964 chr7B 575400000 575474131 7.029839
各列说明:
- 列1:染色体名称(范围从chr1A到chr7B)
- 列2和3:染色体上的位置(窗口大小为100kb)
- 列4:对应窗口的覆盖度(cov)
当前代码与问题
我需要为每个染色体绘制cov变量沿start/stop位置的分布图,当前使用的代码为:
ggplot(tab) + aes(x=start, y=cov, xend=stop) + geom_point() + facet_wrap(~chr)
当前生成的图中所有分面的X、Y轴最大值一致,希望改进为:
- 每个染色体使用独立Y轴:Y轴最大值设为对应染色体的最大cov值
- 每个染色体使用独立X轴:X轴最大值设为对应染色体的最大stop值(即染色体长度)
解决方案
要实现分面独立坐标轴,只需在facet_wrap()中添加scales="free"参数,该参数会让每个分面的X、Y轴都根据自身数据范围自动调整:
ggplot(tab) + aes(x=start, y=cov) + geom_point() + facet_wrap(~chr, scales="free")
参数说明
scales="free":同时释放X轴和Y轴,每个分面的坐标轴范围仅由当前分面内的数据决定,正好满足需求:- Y轴会自动取对应染色体的最大cov值作为上限
- X轴会自动取对应染色体的最大stop值作为上限
补充优化
注意原代码中aes()里的xend=stop对geom_point()无效(点图只需要x/y坐标),所以可以直接去掉。如果需要让Y轴上限略大于最大cov值(避免点贴在轴上),可以结合分组计算的最大值和coord_cartesian()调整,但一般scales="free"已经能满足基础需求。
内容的提问来源于stack exchange,提问作者pedro
相关产品推荐
相关产品推荐

