☰
GraphPad Prism绘制单细胞亚群堆叠柱状图全攻略
2026/10/4 5:19:03 网站建设 项目流程

一提到GraphPad Prism,估计十个做科研的人里有九个第一反应是ELISA的四参数拟合标准曲线。4PL确实是Prism的看家本领,从读板机导出OD值、配标准品、拟合S型曲线,几乎每个做免疫、做转化研究的实验室都靠这个功能干活。但你如果不小心碰上了单细胞测序,手头有一摞Seurat跑完的聚类注释结果,想给最终汇报输出一张“不同组别下各细胞亚群占比怎么变”的堆叠柱状图,其实完全可以不打开R去啃ggplot2。Prism一样能直出,而且出图体验比很多人想象中舒服得多。

这篇文章就是来填这个坑的。适合两类人看:一是在Seurat或Cell Ranger里已经跑完标准分析、拿到细胞亚群注释,但还在愁最终图表怎么做的人;二是临时被通知明天汇报、今晚必须补一张比例图的人。我会从数据整理开始讲,一直讲到导出300dpi的期刊图片,全程图形界面操作,不写代码。

1. 为什么非要用堆叠柱状图来展示单细胞比例

1.1 单细胞分析的收官环节,比例图是刚需

单细胞测序的标准分析流水线走到最后,你会发现真正能写进文章里的图就那么几张:UMAP降维图、Marker基因表达点图、还有细胞亚群比例图。UMAP展示的是细胞群体的聚类结构,让读者直观看到你的分群是否干净;Marker基因点图证明你给每个cluster贴的标签是有依据的;而比例图回答的才是生物学问题本身——药物处理后,CD8阳性T细胞的比例有没有升上来,巨噬细胞是不是从M1型转向了M2型,这类问题翻译成数据语言,就是“各样本中每个细胞亚群的占比”。

堆叠柱状图之所以在这一步成为标准选项,是因为它能把多组、多亚群、比例构成这三重信息压缩在一张图里。每一根柱子是一个样本或一个分组,柱子的总高度固定为100%,每个色段的高度代表该亚群在样本中的相对丰度。读者扫一眼,既能看出组间某个色段的高低变化,又能看出每个样本内部的组成结构,还不容易产生视觉误导。相比之下,分面后的饼图在样本数量多时排版混乱,小提琴图又看不出比例构成,都不是理想载体。

有人可能会说,用R的ggplot2画堆叠柱状图也很方便。确实,如果只是跑一句geom_bar(position = "fill"),R很快。但问题往往不出在画图,而出在后期。你导师可能指着某个亚群说“这个颜色换深一点”,或者审稿人要求把某两个亚群的堆叠顺序调换一下,再或者你想把对照组和处理组的柱子分组排列——在R里改这些,每改一次就是一层代码叠加、一次重新渲染,配色方案还得自己维护。这种频繁修改、反复微调的场景,恰恰是图形界面工具的强项。

1.2 不写代码,Prism在出图阶段更好用

我做单细胞项目的时候,Seurat里所有统计分析的代码一次跑完,但到了出比例图这一步,我反而会把数据导出,交给Prism来画。主要原因有三个。

第一,所见即所得。双击柱子改颜色、拖动调整顺序、点一下切掉网格线,所有操作即时反馈。你不用在脑子里模拟代码运行后的样子,改完马上能看到结果,这在实际赶工时的效率提升非常明显。

第二,图例、标签、坐标轴的管理是自动联动且极简的。Prism的图例与数据表是绑定的,改表里的行名,图例自动跟着变;改图形设置里的标题,坐标轴标签同步更新。对于不熟悉数据可视化底层逻辑的人来说,这套交互大约是学习成本最低的。

第三,Prism的导出模块对期刊友好。很多期刊要求图片是TIFF格式、300dpi以上,或者干脆要矢量图。Prism导出面板里可以直接勾选格式和分辨率,文字不跑偏,线条不糊,基本不用再进Adobe Illustrator做二次清理。相比之下,R画完的图导出后如果字体没嵌入或分辨率不对,处理起来反而更麻烦。

这绝不是说R不好,而是工具要匹配场景。Prism在探索性分析和最终排版这两个阶段,确实有它不可替代的顺滑感。用它做单细胞亚群堆叠柱状图,就是把它的强项用在了正确的地方。

2. 数据准备:从Seurat导出比例矩阵,别在格式上翻车

2.1 用R快速导出计数表和百分比表

在Prism里画堆叠图之前,先得有一张规整的数据表。这张表通常来自Seurat对象的两个维度:细胞亚群注释(比如celltype列)和样本来源(比如sample列)。我之前习惯直接在R里把数据整理好再导出,这样既能在R里核对数字,也方便后面换用其他工具画图。

以下是一段我常用的导出代码,大家可以根据自己的对象名和列名微调:

library(Seurat) # 假设你的Seurat对象叫sce,MetaData中有celltype和sample两列 # 1. 生成亚群 x 样本的计数表 tab <- table(sce$celltype, sce$sample) count_mat <- as.data.frame.matrix(tab) count_mat$cluster <- rownames(count_mat) # 2. 生成亚群 x 样本的百分比表(按列计算百分比) prop_mat <- as.data.frame.matrix(prop.table(tab, margin = 2) * 100) prop_mat$cluster <- rownames(prop_mat) # 3. 导出为CSV write.csv(count_mat, file = "cluster_sample_count.csv", row.names = FALSE) write.csv(prop_mat, file = "cluster_sample_percent.csv", row.names = FALSE)

这里要注意的是prop.table里的margin = 2,意思是按列计算比例,也就是每个样本内部各亚群之和等于100%。如果你的数据是行代表样本、列代表亚群,那么margin要改成1。导出后用Excel打开CSV,直接复制数据区域,等会儿粘贴到Prism里就行。

如果你不想在R里折腾,也可以用Seurat自带的可视化函数先把比例算出来,或者直接在Excel里用数据透视表对细胞数做统计,再手动算出百分比。方式不限,关键是保证最终进入Prism的表格结构是清晰的:每一行一个亚群,每一列一个样本/分组,数值是百分比或原始细胞数。

2.2 Prism表格类型与行列布局的坑

打开Prism,新建表格时会遇到一堆表格类型:Column、Grouped、Contingency、Survival、Parts of whole等等。做堆叠柱状图最常用的是Grouped表,这个类型天然支持“行与列双向分组”的数据结构,和单细胞比例数据的匹配度最高。

选择Grouped表之后,界面会出现一个类似Excel的数据网格。把之前导出的CSV数据粘贴进去,注意放置方向。我用的时候是这么放的:行方向放细胞亚群,顺序就是将来柱子里色段的堆叠顺序,所以最好一开始就把想放底部的亚群放在第一行;列方向放样本或实验分组,每一列对应将来的每一根柱子。

这里有一个特别常见的坑:有人会把样本放在行、亚群放在列,这样画出来的堆叠图X轴会变成亚群类别,柱子之间完全没有组间对比的意义。如果不小心搞反了,Prism里可以通过“Transpose”功能把表格转置,但更方便的还是粘贴数据前先看清行列结构。另外,如果你用的是Contingency表,也可以画堆叠图,它更适合输入原始细胞计数并且需要做Fisher精确检验或卡方检验的场景。但如果只是展示比例并自由控制分组顺序,Grouped表要灵活很多。我的习惯是:做展示图用Grouped,需要顺手做统计检验时用Contingency,两者并不冲突。

2.3 重复样本的放置策略:个体柱还是均值柱

生物实验一般都有重复,比如对照组三只小鼠、给药组三只小鼠。这时在数据表里怎么放?

我建议优先采用“每个样本一根柱子”的方式,也就是X轴上是六个样本标签,属于同一组的样本在列顺序上相邻,后面再用颜色、空隙或分组标签把它们区分开。这种画法信息量最大,能让读者看到组内个体之间的波动,审稿人通常也更认可。我之前做的一个髓系细胞项目就是六根柱子排开,每根柱子上再标出该样本的细胞总数,数据透明度很高。

如果你确实需要展示组间的平均比例,那就先在R或Excel里按组计算每个亚群比例的均值,再把均值表贴进Prism。注意不要直接在Prism的Grouped表里填三个重复值就想让它自动算均值,堆叠柱状图对重复值的处理逻辑和普通柱状图不一样,它会把每个重复值当成独立的柱子或独立的数据点,画出来往往不符合预期。另外,均值柱状图最好加上每个柱段的误差棒或者单独的散点图,否则丢失了生物学重复信息,审稿人很容易质疑。

3. 五分钟直出堆叠柱状图:完整操作流程

3.1 创建图的两种入口,选对类型是关键

数据表建好、数据贴进去之后,创建图形其实非常简单。在Prism左侧导航栏找到数据表名称,选中它,点击工具栏的“New Graph”按钮,或者在左侧“Graphs”区域右键选择“New Graph”,都会弹出一个图形类型选择窗口。

在这个窗口里,你要找的是Grouped类别下的“Stacked”样式。Prism 8之后的版本里,这个样式的缩略图就是几个不同颜色的堆叠矩形,鼠标悬停会显示“Stacked column”或“Stacked bars”这样的名称。选中后点OK,一张基础的堆叠柱状图就生成了。

如果你的数据表已经创建过图形,想改成堆叠图,也无需重新建表。直接双击已有图形,或者右键图形选择“Change Graph Type”,同样能找到堆积柱状图选项。我实操中经常因为一开始选错图表类型而反复切换,Prism这点设计比较贴心,不用从头再来。

需要提醒的是,Prism 9和Prism 10的界面稍有差异,新版将部分基础设置挪到了右侧的Format面板,但核心逻辑一致。如果你用的是Prism 8,路径也基本相同。

3.2 原始计数转百分比:在Prism里一次性解决

如果你在数据表里输入的是原始细胞数,不用急着在R里先算百分比,Prism可以直接把图形显示为百分比。双击Y轴,或者在图形上右键进入Format Axes,找到“Show as percent”或者“Fractions/Percent”相关的选项,勾选后Prism会自动把每根柱子的各部分转换成占该样本总数的百分比,堆叠总高度变为100%。

我自己一般会在R里先把百分比算好,原因不是Prism不能做这件事,而是提前算好可以顺手核对一遍数据、确认没有出现某一行的总和异常。但如果你只是在做快速探索,直接在Prism里转百分比完全够用,也省一步操作。两种方式的结果在图形上没有区别,看个人习惯。

还有一个细节:如果某些样本的总细胞数特别少,比如少于500个,比例柱子在生物学上可能不稳定。此时我通常会在导出图之前,把这类样本单独标注出来,或者干脆在数据表里备注说明,避免在文章中留下隐患。

3.3 给堆叠柱配上清晰的分组标签

基础图生成后,X轴下方默认显示的是你在数据表里的列名,可能是“Control”“Drug_A”这样。如果这些名字在表格里过于简单,或者你想显示成“对照组”“给药组”这类中文标签,可以在数据表上方的Info区域调整行名列名,也可以直接在图形上双击轴标签进行编辑。

如果每组有多个重复样本,我建议在X轴下方再加一个分类变量标签,比如在两组之间留一个小空隙,或者用文本框的方式在柱子下方标示“Control”和“Treatment”。Prism里可以通过添加文本箭头的方式完成,但更简洁的做法其实是在数据表里把列名直接命名为“Control-1”“Control-2”“Control-3”,再在图上手动把大组名标出来,或者干脆利用“Grouped”表的第二行表头信息。具体用哪种方式取决于你的图片是用于内部汇报还是最终投稿,内部汇报越清晰越好,投稿时则要符合目标期刊的数据展示规范。

4. 投稿级别样式调整:配色、图例、坐标轴一次到位

4.1 配色要和UMAP对应,别用默认色

这个建议请务必记住:堆叠图里每个亚群的颜色,最好与你UMAP图里对应亚群的颜色保持一致。你想想看,审稿人先看UMAP,再看后续的比例图,如果两处同一个细胞亚群的颜色对不上,他就得来回比对图例,体验非常差。这也是很多初学者容易忽略的地方。

具体操作是:在UMAP图所用的R代码里,找到每个细胞亚群对应的颜色十六进制值,比如CD8+ T可能是粉红色#F8766D,巨噬细胞可能是蓝色#619CFF,然后把这一组色值记下来,在Prism里双击柱子,进入Format Graph面板,在“Color”选项卡中手动为每个series输入对应的RGB或十六进制色值。

不用纠结于把颜色调得多惊艳,稳定、可区分才是第一原则。我通常选择的配色方案要么是Seurat默认的经典色系,要么是ColorBrewer的Set2或Paired方案,这两套对色盲读者比较友好,打印成黑白稿时也还能区分。你自己开发一套固定色板也行,但一定要在所有图里保持统一。

4.2 图例和坐标轴的细节处理

图例是堆叠柱状图的门面。默认情况下,Prism会把图例放在图表右上角,看起来略挤。双击图例打开Format Legend,可以调整位置、字体和排列方向。亚群数量多的时候,我一般把图例改成水平排列放在图的正下方,每个条目之间留足间距,比堆在右侧清爽得多。

图例里的名字默认是数据表的行名,也就是细胞亚群名称。如果有些亚群命名太长(比如“CD45+Ly6C+ inflammatory monocyte”),建议在数据表里改成一个更短的展示名,比如“Inflammatory Mono”,等导图之后再在Figure Legend里写全称。否则图例宽度会拖得很夸张,占据大量画面空间。

坐标轴方面,双击Y轴进入Format Axes面板,把范围锁定为0-100(如果你已经按百分比显示),主刻度间隔设为20或25都可以。然后把轴线上的数字格式改成带百分号的形式,让读者不用猜单位。X轴如果样本数多、标签重叠,可以在“Labels”选项卡里把标签旋转45度或90度,保证每个样本名都清晰可读。

4.3 柱段宽度、间距与字体统一

柱状图的“气质”往往藏在细节里。双击柱状图任意区域进入Format Graph面板,可以调整柱子的宽度以及柱子之间的间距。我的经验是:如果只有四到六根柱子,柱子可以宽一点,间距也大一点,让整体显得大气;如果样本数量达到八个以上,柱子应该略微收窄,否则相邻柱子的色段边界容易黏连,看不清楚。

字体统一也很重要。图形中所有文字,包括坐标轴刻度、图例、轴标题,应该尽量用同一种字体,比如Arial或者Helvetica。很多期刊对图片字体有明确要求,有的甚至要求最终图中的所有文字都要在矢量化之后仍可编辑。Prism在这方面做得不错,只要你一开始设置好字体,导出的PDF或TIFF都会保留。

一个我自己踩过的坑:在Prism里把图窗拖得很大,字号看起来合适,但导出之后发现字变小了。原因是我在导出时勾选了“Scale”相关选项,图形被按比例缩放过。现在我的习惯是,在导出前把图形窗口调整到接近目标尺寸,字号设定为7到8pt,导出几个版本检查一下再定稿。

5. 常见问题与排查技巧实录

5.1 柱段顺序和方向不对怎么调

有时候建好图,发现某个亚群跑到了最顶上,可你希望它靠近柱子底部。调整方法有两种,但都很快。

第一种是在数据表里直接调整行的顺序:把你想放到底部的行移到最上面,重新生成图形即可。第二种是双击图形,在Format Graph面板里找到Series相关的设置,通过上下箭头调整每个series的绘制顺序。两种方式效果一样,我一般习惯用数据表,因为表格看得到数字,改起来更有数。

如果图形整体变成了水平方向的条形,也不用慌。在Format Graph面板里找到Direction设置,把“Horizontal”切回“Vertical”,柱子就会转正。这个设置有时候会被误触,尤其是Prism的默认模板发生过变化时。

5.2 低占比亚群太多,柱子糊成一团

这是单细胞堆叠图最常遇到的问题。细胞亚群注释一多,比如超过15个,柱子上的色带会变得非常窄,图例也要占半页。更麻烦的是,有些亚群的占比只有1%都不到,画上去几乎看不见,却仍然占用一个图例条目。

我的建议是:把低占比亚群合并成“Other”。具体阈值没有绝对标准,一般是把占比小于2%的亚群归在一起,或者根据你研究的重点,把所有与主线故事无关的零散亚群合并。合并操作可以在R里做,也可以在Excel里手动把对应的行加起来。

要注意的是合并之后的配色问题。我通常给“Other”一个灰色或暗灰色,让它视觉上退居次要地位,同时保证UMAP图上同样把这类细胞标成相同颜色,保持图与图之间的一致。实操时,我会先在R里产生一版“合并前”和“合并后”的数据,核对一遍各样本总比例仍然等于100%,再决定用哪一版进Prism。

5.3 导出分辨率与期刊要求

导出是很多人最后一步翻车的地方。Prism的File菜单里选择Export,会弹出导出设置面板。如果你准备投稿,请把Image Format选为TIFF,Resolution设为300dpi或以上,同时勾选“Use TrueType fonts”之类的选项,保证字体嵌入不会变形。

如果期刊要求矢量图,PDF是更稳妥的选择。Prism导出的PDF是矢量格式,里面的文字和图形元素在Illustrator或Inkscape中都可以进一步编辑,这一点对需要统一图片风格的人来说非常有用。我一般会导出一份TIFF用于在线投稿,再留一份PDF作为备份,万一审稿人要求修改颜色或字体,直接用PDF源文件在本地改。

还有一个小技巧:导出前先检查图表区域有没有被空白包围太多。双击图表区域看不到明显的裁剪框时,可以在图表属性里设置自动适应内容。否则导出的TIFF四周可能出现大片白边,还要二次裁剪。

5.4 图例条目和柱段数量不一致

如果在数据表里某一行在当前所有样本中都是零,Prism可能不会画出这个系列的柱段,但图例里可能依然保留这个条目,导致图例与图形不匹配。解决办法有两个:要么把那行的空单元格补成0,让图形至少有一个占位;要么在图例设置里手动隐藏空系列。

这个问题的潜在影响是,你自查的时候可能没在意,但审稿人或读者会问“图例中有这个亚群,柱子里为什么找不到”。所以每次导图前,我习惯数一数柱子上可见的色段数量与图例条目数量是否能对上。

6. 进阶玩法与投稿前最后检查

6.1 双向堆叠图与统计标注的正确打开方式

有时候你想强调治疗前后或某种处理的正反对比,可以把对照组和处理组分别放在零轴两侧,形成双向堆叠图。Prism里实现这个效果并不复杂:一个方法是把其中一组数据乘以-1,让它在Y轴负半轴绘图;另一个方法是修改图形设置里的方向选项。双向堆叠图在展示“增减方向”时非常有冲击力,但要注意双向图的Y轴标签要写清楚,比如“Control”一侧向上或向下,不能让读者产生误解。

需要提醒的是,不要在堆叠图上直接标P值。堆叠图展示的是比例构成,而非单一变量的组间差异。如果你要报告“CD8+ T细胞比例在给药组显著上升”,正确做法是把每个样本的CD8+ T比例单独拉出来做一张散点图或箱线图,加上t检验或秩和检验的P值。堆叠图作为全景展示就够了,统计推断交给专门的图表去做,这是论文写作中容易被忽略却又非常重要的原则。

6.2 投稿前必须核对的四个数字

我每次做完整张图,定稿前都会花几分钟检查四件事,建议你也照做。

第一,检查每个样本的各亚群比例之和是否等于100%。如果不等,多半是粘贴数据时漏了行或者合并不当。第二,核对样本标签和分组是否和原始数据表一致,尤其是样本数多、排序列复杂时,复制粘贴容易错位。第三,确认每个样本的总细胞数或注释细胞数是否在方法学中有交代,审稿人很在意不同样本细胞总量差异较大时,百分比是否具有可比性。第四,检查图片中出现的所有缩写是否在正文或图注中首次出现时有全称,比如“Treg”要写清“regulatory T cell”。

这四项检查看起来很基础,但我在过去的工作中真的遇到过样本质检全过、最后因为一张比例图标签错误被要求返修的情况。所有自动化的检查在“人眼对比原始数据”这一步上,暂时还替代不了。

6.3 从一张图衍生更多图表

当你把堆叠柱状图的工作流跑通之后,会发现同一份比例数据还可以衍生出很多延长分析。比如把某个核心亚群在不同样本中的比例单独提取出来,配上中位数和四分位距做成箱线图;或者仿照“组分变化”的思路,把样本分组后按均值比例绘制堆叠柱,旁边再放一张主成分分析图展示组间相似性。这些图在Prism里都能比较直接地完成,关键是数据表格的结构一定要在前期打好基础。

我现在的固定流程是:Seurat里跑完整分析,导出比例矩阵后,把百分比表交给Prism画堆叠柱状图,把单个亚群的比例表交给Prism画散点图和统计检验,最后所有图汇总到一张画板里统一调整风格。这样每个工具都用在了自己的强项上,出图效率比我早期用R全部包办要高一截。

最后说点实在的

我自己的体会是,无论工具多顺手,最终投出去之前一定要回到原始数据核对一遍关键数字。堆叠图太容易做得漂亮了,正因为漂亮,反而可能掩盖数据里的一些问题。比如某个处理组的细胞回收量远低于对照组,总细胞数不均衡,百分比图就会显得这个组某个亚群“特别高”,但这可能只是分母太小造成的假象。这种信息不会直接体现在柱子上,但作为作者,你必须在分析和图注里主动交代清楚。

GraphPad Prism确实不只是做ELISA标准曲线的。把它当成一个轻量级的出版级绘图工作台,你会发现日常出图的效率会有很大提升。尤其像单细胞比例图这种需要对颜色、顺序、标签反复调整的场景,图形界面反而比写代码更抗压。下一次再有人问你怎么快速画单细胞亚群堆叠柱状图,你可以直接把这篇文章转给他,顺便补一句:记得颜色和UMAP对应上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询