什么时候用它
GWAS 或基因水平关联分析跑完,手上是几十万到几百万行检验结果。Manhattan plot 把它们压进一张图:横轴按染色体和物理位置排,纵轴是 -log10(P)——P 越小点越高,显著信号就像高楼一样从背景里立出来。
它回答的是"哪里值得跟进",不回答"效应有多大"。
本质上它就是一张散点图(位置 vs -log10(P)),只是横轴按染色体分了段——所以这里归在散点那一族,而不是单开一档。
怎么读
- 先看 y 轴。 是
-log10(P),不是效应量。点越高只说明 P 越小。 - 横轴不是连续坐标轴。 它按染色体分段,段内才是物理位置。相邻两点可能隔着几百万碱基。
- 看阈值线。 超过线的点是候选。用的是哪条线(Bonferroni / FDR / suggestive)必须在图注里说清楚,三者含义完全不同。
- 看峰不看点。 同一区域连续多个点一起升高,比一个孤立高点可信得多——后者常常是基因分型错误。
- 标签只是候选。 标注出来的位点还需要后续精细定位和功能解释。
常见陷阱
- 高点不等于效应大。 样本量足够时,一个很小的效应也能给出极小的 P。
- 阈值必须说明。
5e-8是全基因组显著性的惯例(约等于 100 万次独立检验的 Bonferroni 校正),1e-6只是提示性水平。 - 标签别标太多。 标注超过十来个就会互相遮挡,反而看不见信号峰。
- P 值必须大于 0。 有 0 或缺失时
-log10(P)会出Inf或NA,整张图会歪。画之前先查。 - 染色体和位置列错了图就没意义。 而且不会报错——它照样画得出来,只是排序全乱。
CMplot()默认会自己往磁盘写文件。file.output的默认值是TRUE,不设就会在工作目录里落下一堆图。上面两段都关掉了它,是因为要把图画到当前设备上;但真要导出时反过来该用它——file = "pdf"、dpi = 300、file.name = "..."交给 CMplot 自己处理,它会按图的内容挑合适的画布尺寸。手动png()→CMplot()→dev.off()也行,但尺寸得自己试。
配色
这条 recipe 使用站内定性色板 cancer_mosaic。深蓝与橙色交替区分相邻染色体,红色标出 Top hits,粉色表示 genome-wide 阈值与信号,亮蓝色表示 suggestive 阈值与信号。这个组合接近 Manhattan plot 常见的蓝橙背景与红粉蓝信号层次,矩形与圆形布局保持一致。
Manhattan plot 的颜色不是五个平级分类:背景染色体、重点位点和两级阈值承担不同语义。因此这里显式按名称分配色板中的五个位置,而不是把色板直接循环到所有元素上;图例和标签仍是判断信号级别的必要依据。
圆形图最外圈的标记密度是连续量,不再混用多种分类色。它使用 cancer_mosaic 深蓝色派生的浅蓝至深蓝梯度:颜色越深表示局部标记越密。梯度截掉了最接近白色的约 42%,让最低非零档从清楚可见的浅蓝开始,也避免把密度误读成额外的类别或信号等级。

