资讯动态

GraphPad Prism绘制单细胞堆叠柱状图全流程:从Seurat到论文级图表

发布时间:2026/10/4 5:35:21 来源:尧图企业网站定制
用了几年GraphPad Prism我最早的印象和大家差不多这软件就是用来跑ELISA标准曲线的——四参数Logistic那套从标准品浓度到OD值一键拟合出R²和IC50。后来自己开始做单细胞测序注释出十几个细胞亚群卡在“怎么把不同样本的细胞亚群比例变化画得让导师一眼看懂”这件事上试了一圈工具才发现Prism做这个事其实是条捷径速度远超预期。这篇文章就是一套完整流程从Seurat注释结果导出比例表、在Prism里摆成分组表、直出堆叠柱状图、再调成能直接放进论文的图。对R不熟也没关系只要能导出CSV就能跟着做对R很熟的人也可以把这套流程当“最终排版神器”来用。1. 为什么单细胞分析快收官时大家都在画堆叠柱状图1.1 堆叠柱状图本质上回答的是审稿人最关心的那个问题单细胞测序主流程走完质控、降维、聚类、找marker、注释细胞类型这些环节决定了你“看到了什么”。但审稿人拿到稿件时第一个想确认的不是你发现了什么新亚群而是你的处理条件到底改变了什么不同组之间哪些细胞亚群的比例发生了肉眼可见的漂移堆叠柱状图就是为这个场景设计的。它的读图逻辑非常朴素横轴是一个个样本或实验组纵轴如果是百分比每个柱子总高就是100%柱内从下到上被切成不同颜色的色块每个色块对应一类细胞亚群色块的长度就是该亚群在该样本里的占比。一眼扫过去你就能看出CD4 T细胞在对照组里占了大概三成到了药物处理组缩成不到两成而这个空白恰好被单核细胞补上了——这种“此消彼长”的构成变化用普通的均值条形图加误差棒根本表达不出来用热图又显得太技术流堆叠柱状图是生物学论文里最通用、最没有阅读门槛的表现形式。另外堆叠柱状图很适合展示个体差异。比如临床样本对照组三个病人、处理组三个病人每个病人单独拉一根柱子你能直接看到亚群比例在组内是不是稳定。如果组内一根柱子跟另一根差得特别远这往往比组间差异更值得警惕可能在提示样本异质性或者批次效应没有完全校正干净。这一点在投稿前特别管用比单纯看一个p值更能暴露数据质量问题。1.2 Prism在单细胞可视化管线里的真实位置很多做单细胞的人习惯全程用R从读矩阵到出图都交给ggplot2。ggplot2当然能做堆叠柱状图而且自由度极高但问题在于单细胞分析的图量太大了聚类UMAP、marker表达、通路富集、比例变化每张图都要单独调主题、调颜色、调字体大小这些参数在R里试错一轮时间成本相当可观。而且ggplot2默认输出的图到了排版阶段经常还得用Adobe Illustrator再手动拆开调一遍。Prism的定位不太一样它不是拿来跑数据分析的而是拿来“精修最终呈现”的。它和Excel很像表格是表格、图形是图形改一改表格数据图形同步刷新双击图上的任何一个元素颜色、边框、字体、坐标轴、图例、标签全都直接改。这种交互模式意味着你不需要在脑海里预先构建一个完整的图形语法你只需要看着图觉得哪里不对就点哪里。我用Prism做过ELISA标准曲线之后发现它的图表类型覆盖范围其实比大多数人以为的要广得多不仅有四参数Logistic拟合还有各种柱状图、散点图、箱线图、生存曲线、热图以及本篇文章要说的堆叠柱状图。对一个做湿实验和生信结合的课题组来讲从ELISA到单细胞验证实验Prism这一个软件能覆盖掉一多半的最终出图需求。2. 从Seurat手里拿数据先造出一个格式正确的百分比矩阵2.1 为什么不直接在Prism里统计先说清楚一条边界Prism不是一个数据整理工具它的强项是“展示已经整理好的数据”。你在Seurat里已经算好每个亚群的细胞数、算出百分比了把它交给Prism它负责画图如果你指望在Prism里做复杂的宽表转长表、分组汇总、百分比计算那不是它的活做起来会非常别扭。所以第一步永远是在R里把表整理成Prism喜欢的形状。那Prism喜欢什么形状做堆叠柱状图它最希望拿到一份“百分比矩阵”宽表格式每一行是一种细胞亚群每一列是一个样本或实验组单元格里是该样本中该亚群的百分比举个例子亚群Ctrl-1Ctrl-2Treat-1Treat-2CD4 T32.130.521.319.8CD8 T24.626.028.927.5NK10.49.815.216.0B18.019.215.416.1Monocytes14.914.519.220.6这比长表直观得多而且它和Prism的内存模型完全匹配行标题对应堆叠柱状图的图例条目列标题对应每根柱子单元格数值对应色块的长度。2.2 用R一步生成上传表格假设你的Seurat对象已经完成了细胞类型注释meta.data里至少有两列一列是样本名sample一列是注释好的细胞类型celltype。生成上述矩阵只需很短几行代码library(dplyr) library(tidyr) # seurat_meta 可以从 seuratmeta.data 直接取出 # 这里以 data.frame 示意 prop_df - seurat_meta %% count(sample, celltype) %% group_by(sample) %% mutate(pct n / sum(n) * 100) %% select(sample, celltype, pct) %% pivot_wider(names_from celltype, values_from pct) write.csv(prop_df, celltype_prop_by_sample.csv, row.names FALSE)这段代码做三件事统计每个样本里每种细胞亚群的细胞数把细胞数转换成组内百分比把长表转成宽表并导出CSV。如果你不只关心百分比还想要原始细胞数也可以把mutate(pct n / sum(n) * 100)这行改成同时保留n和pct两个字段然后分别导出两个CSV。原始细胞数在有些场景下有用比如样本之间总细胞数差异很大时单纯看比例会掩盖绝对数量的变化这时候你可能需要并排展示“绝对数量堆叠柱状图”和“百分比堆叠柱状图”两张图。不过大多数情况下百分比图就够回答了。2.3 CSV导出的三个细节决定你后面顺不顺利第一亚群列的顺序。在R里pivot_wider生成的新列顺序默认按字母排序所以你最后的CSV里列可能是B、CD4 T、CD8 T、Monocytes、NK这样一个“按字母排”的顺序。这个顺序会直接影响Prism里的图例顺序和柱内色块顺序。如果你希望图例从上往下是按自己排好的顺序比如从T细胞到髓系细胞可以先把celltype列转成factor并指定levelsseurat_meta$celltype - factor(seurat_meta$celltype, levels c(CD4 T, CD8 T, NK, B, Monocytes))转换后再跑计数和pivotCSV的列顺序就会按你设定的levels走。第二缺失亚群的处理。如果某个样本里完全没有某一类细胞R里生出来的对应单元格会是NA。这在Prism里会被当作空值导致那一根柱子的对应色块直接消失但柱子总高仍然是100%视觉上可能让人误以为“这个样本少了某个部分但实际上只是比例为零”。我的做法是提前把NA替换成0这样柱子的色块就会以零高度显示不会产生视觉缺口prop_df[is.na(prop_df)] - 0第三CSV文件的编码问题。Windows上打开的Excel默认可能是“ANSI”或“GBK”编码如果你的亚群名包含中文字符用write.csv导出的UTF-8编码文件在旧版Excel里打开会乱码。单细胞论文一般要求全英文标注所以我建议亚群名、样本名都直接写成英文既避免编码问题也省去投稿时改标签的麻烦。3. Prism建表行放亚群、列放样本组数据的摆放方式是关键3.1 新建分组数据表按“行亚群、列样本/组”粘贴打开GraphPad Prism点击New数据表类型选择Grouped分组表。这时它会问你分组方式选“行是不同类别列是不同数据集”这种默认模式就行因为我们就是要把细胞类型放在行上。进入空白表格之后你会看到这样几个区域最左侧是行标题区Row Titles用来输入细胞亚群名顶部是列标题区Column Titles用来输入样本或实验组名中间的单元格就是数值区从CSV里把数据复制粘贴进来的方式有两种我推荐更稳妥的一种先打开CSV从R导出的数据第一行是表头亚群列表头从第二行开始才是数据但直接用Excel全选复制再粘到Prism有时会因为表头格式不匹配导致偏移。所以我习惯先在Excel里把表做成和Prism结构完全一致的样子再全选复制粘贴第一行写上各列的表头第一格留空后面依次是Ctrl-1、Ctrl-2、Treat-1、Treat-2第二行开始A列写细胞类型名B列开始写数值全选复制到Prism表格中从左上角开始粘贴粘贴完成后检查一下行标题和列标题是否正确显示在Prism对应的灰色区域里。如果发现数值错位通常是因为CSV里第一列行名也被当成数据粘进去了撤销重来或者先删除表格内容再调整表头位置。3.2 子列到底怎么用组内重复样本的正确摆法如果你有多个样本属于同一个实验组比如Ctrl组有3个病人Treat组有3个病人那么有两种处理思路。第一种是“每根柱子代表一个病人”横轴直接就是6根柱子。这种操作最简单不需要用子列直接在列标题区写上样本名Ctrl-1、Ctrl-2、Ctrl-3、Treat-1、Treat-2、Treat-3每列一个样本。第二种是“每根柱子代表一个实验组组内多个病人作为重复”横轴只有Ctrl和Treat两根柱子柱子的高度显示的是组内均值柱顶还可以加误差棒。这种需求就要用到Prism的子列功能了。在分组表里把鼠标移到列标题区域右键可以“插入子列”。比如在Ctrl这列下面插入3个子列分别命名为Ctrl-1、Ctrl-2、Ctrl-3。这样Ctrl这个父列下就有三份重复数据Prism会自动计算均值和标准差在堆叠柱状图里以均值的色块高度显示并可选添加误差棒。这里有一个经常让人困惑的点百分比数据的误差棒到底该用SD还是SEM如果图上要展示的是“每个样本的具体构成”我通常不画误差棒因为那会掩盖个体差异如果目的是比较组间差异可以画SD因为SD反映组内波动范围审稿人更喜欢看到这个。SEM虽然柱子显得更“好看”但它本质上是抽样误差在非随机抽样的临床数据里意义有限。这一点在Methods里最好写清楚。第三种情况如果你的样本特别多且不是按实验组分组的比如一个队列里几十个病人那其实已经不适合用堆叠柱状图了。这时候建议回归长表改用“亚群比例箱线图”或者其他更适合大样本量的图。4. 从表格到堆叠柱状图三步走中间没有悬念4.1 选对图表类型分组表 → 柱状图 → 堆叠数据在Prism表格里排好之后点击工具栏的Insert或直接点图表区域会弹出Change Graph Type更改图表类型对话框。在左侧的图表类型列表里选择Bar chart柱状图然后在右上角的长方形预览图里找到“堆叠柱状图”的小图标。它的样子是一根柱子上分了好几段颜色。选中它点击OK一张默认配色、默认坐标轴的堆叠柱状图就生成了。如果这个过程中找不到堆叠柱状的图标最常见的原因是数据表类型选错了比如你新建的是Column表而不是Grouped表。Column表没有“行类别列组别”的结构Prism不会给你堆叠选项。解决办法就是回到数据表新建一个Grouped表或者右键数据表名称选择Change Data Table Type改成Grouped再重新粘贴数据。生成之后你看到的图可能和你想象中不太一样——柱子的顺序、颜色、图例顺序都还是默认状态。别急后续的微调都在图形区域双击完成。有一点要特别强调Prism的图表是对数据表的“视图”它不会破坏原始数据。哪怕你把图调得面目全非表格里的数值依然完好随时可以重新生成另一张图这也是“直出”工作流安全性的来源。4.2 方向不对、顺序不对、间距不对双击图表逐个解决图表生成后最常见的调整有这几类。如果你希望横轴和纵轴互换即柱子横向排列而不是纵向可以双击坐标轴在Axes选项卡里勾选“Horizontal”水平方向或者直接右键图表选择Rotate。横向堆叠柱状图在亚群数量特别多时会更好用因为细胞类型名排在纵轴上横着排列文字充足不用担心斜着显示。柱子间距的调整也很实用。双击图表进入Format Graph找到柱状图相关的Gap参数。默认间距有时过大导致柱子显得细而散。发表级的图通常希望柱子宽度适中、柱间距较小我一般把柱子间距设为柱宽的一半左右。不同版本的Prism里这个参数叫法略有区别但基本都在柱状图格式设置的Bar区域里调成自己看着舒服的比例就好。还有一个顺序问题Prism图里的图例顺序默认是按数据表的行顺序从上到下排列的。如果你的图里CD8 T跑到了图例最上面而你想让CD4 T在最上直接改数据表的行顺序即可——在数据表里拖动行标题把它移到目标位置图形会自动刷新。这是Prism最让我欣赏的地方它把“数据的逻辑顺序”和“图形的视觉顺序”完全对应起来改数据表就是改图。4.3 颜色方案别自己调色从Seurat或CellTypist里抄现成的堆叠柱状图的观感大头在于配色。每个细胞亚群一个颜色如果颜色选得不好相近的色块挤在一起读者根本分不清边界。很多新手喜欢用Prism自带的默认配色不是不能用但那些颜色在单细胞领域已经被用得太泛而且辨识度一般。我的建议是直接沿用你在其他单细胞图里用过的同一套亚群配色方案保证一篇文章里UMAP图、堆叠柱状图、marker热图的颜色体系完全一致。如果你在Seurat里用了ggplot2的scale_color_manual给亚群指定过颜色那你可以从R里把这串颜色代码导出或者干脆去看CellTypist等注释工具自带的亚群配色字典。拿到十六进制色值之后在Prism里双击某个色块区域进入填充颜色设置选Custom输入hex码比如#E64B35即可精确匹配。这里有个小技巧如果你不想一个个在Prism里手动敲色值可以在R里直接把颜色代码拼成一行存成一个txt文件color_palette - c( CD4 T #E64B35, CD8 T #4DBBD5, NK #00A087, B #3C5488, Monocytes #F39B7F ) writeLines(names(color_palette), celltype_order.txt) writeLines(color_palette, celltype_colors.txt)然后在Prism里逐个色块粘贴色值整个过程也就三五分钟但它带来的统一感会让审稿人在翻图时觉得你做事非常细致。5. 投稿前的细节打磨字体、坐标轴、图例和导出格式5.1 字体与坐标轴的“潜规则”很多期刊对图的字体有隐性要求虽然不会在投稿须知里强制规定单个软件但默认接受Arial或Helvetica这类无衬线字体字号通常在7到8 pt之间。在Prism里双击坐标轴标题或刻度数字在字体选项卡中把全图统一设成Arial、8 pt是一个比较稳妥的起点。如果图最终要缩放到单栏宽度字号甚至可以更小但要保证导出后仍然清晰可读。坐标轴方面百分比堆叠柱状图的Y轴刻度起点一定是0终点不需要是100因为纵轴可能只是表示柱子的总高但科学起见建议让Y轴最大刻度略高于100比如110避免最顶端色块的标签被切掉。还有一个细节Y轴的单位标注尽量写成“Percentage (%)”而不是“Percent”后者的表述在学术写作里显得不够正式。如果你希望每根柱子上直接标出亚群百分比数值可以双击柱子在Labels选项卡里勾选“Show value labels”并设置数字格式为#.#保留一位小数。不过我个人很少在堆叠图上直接标数值因为色块一多标签会挤在一起更推荐的方式是在图注里把关键数据写成文字或者把堆叠图和一个单独的表格并排放置需要精读的读者可以从表格里获取精确值。5.2 图例位置和边框是容易被忽略的细节图例默认出现在图形右侧有时候还会带一个框线这在最终排版里会显得比较笨重。双击图例区域取消边框选择一个不影响数据展示的位置。亚群数量少时放在图形右外侧没问题数量多时建议放在图的正下方横向排列。图例的标题默认可能是空白的你可以双击图例标题区域输入“Cell type”一类的说明。但如果你的图例里已经明确写了CD4 T、CD8 T不写标题也完全合理省掉反而更干净。另外图例顺序一定和图内色块顺序保持一致这一点前面提到过改数据表行顺序即可不要在图形区域单独拖动图例项目那样容易造成图例和柱子对应关系的混乱。5.3 导出别只导png给期刊留一条后路Prism的导出功能在File → Export里。如果是最终投稿我一般会选择导出TIFF文件并设置300 DPI分辨率如果期刊要求矢量图选择导出PDF或EPS。Prism导出的PDF在Adobe Illustrator里可以继续编辑后续期刊编辑部如果需要对文字进行字体替换也能正常处理。还要注意一个细节如果你在Prism里用了中文字体命名导出PDF后在其他设备上可能因为字体缺失而乱码这也是我建议所有标签都用英文的另一个原因。导出之前最后过一遍看看有没有不经意留下的像素化边缘、有没有色块边界模糊、有没有字体大小不一致。图已经做到位的话导出这一步就是走个流程。6. 实操中绕不开的坑以及我目前固定下来的流程6.1 我在实际使用中踩过的几个坑坑一Excel科学计数法导致数据精度丢失。在R里导出的CSV如果数值很小比如某个稀有亚群比例只有0.0003用Excel打开并保存之后再粘贴到Prism里数值可能变成科学计数法或精度被四舍五入。解决办法是尽量不在中间环节用Excel编辑数值CSV直接粘到Prism如果必须在Excel里调整打开后先把该列格式设置为“数值”保留足够的小数位数再复制粘贴。坑二百分比和原始细胞数混淆。堆叠柱状图如果混合使用了百分比和细胞数柱子总高会不一致百分比的柱子总高是100细胞数的柱子总高取决于该样本的总细胞数两者放在同一张图里会造成严重的视觉误导。所以我每次作图前都会看一眼数据表里的数值范围确保同一张图内全是百分比或者全是细胞数。坑三图例顺序和色块顺序对不上。这在从Excel复制到Prism时经常发生尤其是CSV列顺序发生变动之后。排查方法很简单点一下柱状图上的某个色块Prism会自动高亮对应的数据表列和图例条目一眼就能看出是否错位。坑四堆叠柱状图里显示均值和误差棒时百分比误差棒超出100。这是常见问题如果某个样本某亚群比例接近100且有波动误差棒可能会越过100的上限。解决方法是把坐标轴最大值设成120或者不显示误差棒在文字里说明组内范围。6.2 我现在的标准工作流经过几轮项目沉淀我现在做单细胞堆叠柱状图的流程基本固定成了六步在Seurat或Scanpy里完成细胞类型注释用R生成“行亚群、列样本/组”的百分比矩阵导出CSV在R里设置好亚群factor level确保CSV列顺序就是想要的图例顺序并处理掉NA新建Prism Grouped表把CSV内容粘贴进去列标题改成最终要显示的样本或组名选择堆叠柱状图调整柱子方向、间距、颜色颜色代码保持一致双击调整字体、坐标轴、图例、标签、误差棒把所有文本统一成英文导出TIFF 300 DPI或PDF放入论文文件夹同时备份.pzfx源文件以便后续修改这个流程最大的好处是从Seurat输出到最终投稿图中间的软件切换只有R和Prism一次不用把图先在R里画好再导入AI修也不用在Excel和Prism之间来回倒腾。对我这种半路出家的生信用户来说节省的不只是时间还有排查各种格式问题的精力。最后分享一个和本文无关但很实用的经验Prism的.pzfx源文件建议放在和数据文件同一个目录下用带日期的名字命名比如Figure2_stack_bar_20250115.pzfx。我见过不止一次论文修回时审稿人要求改某个图的颜色或字体结果原图文件忘了存只能从头再做一遍。把这个小习惯养成之后至少能让你在返修时少掉不少头发。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑