恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操
首页
资讯中心
/
MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操
MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操
发布时间:2026/10/18 10:41:51
前几天一个来问我论文图的同学把同一份数据画成了两种图给我看一张是经典的“均值±标准误”条形图另一张是盒图。数据明明差不多但盒图里那个刺眼的离群点在条形图里完全看不出影子。这种感受我相信改过稿的人都懂。盒图Boxplot在MATLAB里用boxplot函数就能画但它绝不是把命令敲出来就结束的事情——从数据组织、分组方式到线条粗细、配色、导出格式每一步都直接影响你的图能不能达到期刊排版的要求。这篇文章我把盒图的读图逻辑、MATLAB实现细节和踩坑记录整理成一份可以直接参照的实操笔记送给正在写论文、尤其是被图表折磨过的同学。1. 为什么论文里需要盒图——它比“均值±误差棒”多讲了多少信息1.1 条形图误差棒隐藏了什么很多同学习惯用“均值±标准差”或者“均值±标准误”来展示连续型数据画出来的效果就是一根竖线加一个小方块。这种图本身没有错但是它的信息密度实在太低了。它只给了你两个数字一个中心位置一个离散程度。问题是这两组数字只能描述一个近似对称、没有异常值的分布如果数据不那么“规整”它就会掩盖很多东西。举个例子有两位同学测同一指标A组数据是[3.1, 3.2, 3.0, 3.1, 3.3]B组数据是[3.1, 3.2, 3.0, 3.1, 6.8]。两组的均值分别是3.14和3.84标准差分别是0.13和1.66。如果画成均值±标准差你只会觉得B组数据“变大了、变散了”但盒图会直接告诉你B组有一个明显离群的异常值剩下四个点其实和A组差不多。这就是盒图的第一个价值它不会让极端值悄悄混进整体印象里。还有一层更隐蔽的问题偏态分布。反应时间、荧光强度、细胞计数这类数据经常是右偏的中位数和均值可以相差很大。均值±误差棒隐含了“分布对称”的假设当数据严重偏态时这个展示方式会误导读者。盒图画出来之后你一眼就能看出箱体上下不对称哪边尾巴长问题出在哪。1.2 小样本、非正态与审稿人的偏好期刊那边的情况也在变化。越来越多审稿人看到“纯均值±误差棒”的图会追问数据分布情况、样本量是否足够、离群点是怎么处理的。盒图正好是这些问题的折中答案它把位置、离散度、偏态、离群点压缩到一张图里信息密度非常高。在统计方法上盒图也是非参数检验的天然伴侣。比如两组数据不符合正态分布你用 Mann-Whitney U 检验报告里说“中位数四分位距”配的图就应该是盒图。反过来如果你写的是“均值±标准差”后面却接了非参数检验审稿人大概率会提意见“既然用了秩和检验为什么不展示中位数”这一点在生物医学、环境科学、农学、经济学的论文里越来越常见。盒图对小样本也比较友好。当每组只有5到10个点的时候均值±误差棒往往受一个极端值影响很大而中位数和四分位数是稳健统计量几个极端点不容易把它们带偏。所以盒图不是“条形图的替代品”而是补充了条形图画不出来的那一层信息。我个人的习惯是如果数据量够大、分布接近正态并在正文里用了参数检验那均值±误差棒仍然可以用但只要数据偏态、有小样本、有离群点或者用了非参数检验我默认就切到盒图了。2. 盒图的五个关键数字从下须到上须的读图逻辑2.1 箱体、须线与离群点的几何含义别看盒图长得简单它背后是一套“五数概括法”。从下往上五条关键线分别是下须端点、第一四分位数Q1、中位数Q2、第三四分位数Q3、上须端点。箱体从Q1到Q3箱体高度就是四分位距IQR Q3 - Q1箱体中间那根粗线是中位数上下伸出去的须线标准情况下不是把最小值和最大值直接连出来而是画到不超过Q1 - 1.5*IQR和Q3 1.5*IQR范围内的最远实际观测点。这句话值得多看两眼。很多人以为须线端点一定等于Q1 - 1.5*IQR或Q3 1.5*IQR其实不是。它画的是“在这个允许范围内最远的数据点”。如果数据比较集中根本没有观测到那么远须线就会比理论边界短。超过这个范围的点才被单独标记为离群点MATLAB默认用小十字画出来。这个默认规则来自统计学里一个比较经典的经验倍数1.5倍IQR。这个阈值既不会让正常观测被误伤太多也不会让真正的极端值被藏起来。如果你把Whisker参数设成3须线会伸得更远离群点会变少设成0须线几乎没有了。默认值在绝大多数论文场景里都够用。2.2 分位数算法与Notch凹槽的细节不同软件算四分位数的插值方法不完全一样所以同一份数据在MATLAB、R、Python里画出来的盒图Q1和Q3可能有细微差异。MATLAB的boxplot走的是它内部的分位数计算默认方式和R的type7比较接近数据量比较大的时候几乎看不出差别但在小样本或数据量只有十几个时精确到小数点后两位会有变化。这个不是bug写论文时注明“用MATLAB默认分位数算法”就够了不必纠结。MATLAB还支持给盒图加凹槽也就是Notch, on。开了之后中位数附近会凹进去一块凹槽端点大致是median ± 1.57 * IQR / sqrt(n)近似表示中位数的95%置信区间。经验上如果两组盒图的凹槽区域完全不重叠可以粗略认为两个中位数差异显著。但是要注意这只是“粗略”的视觉判断论文里做显著性结论一定要搭配正式的假设检验比如秩和检验、t检验或相应的方差分析方法。凹槽适合做探索性分析不适合代替p值。盒图的纵轴单位如果带了对数性质比如浓度、滴度、菌落数建议先取对数再画盒图或者直接把坐标轴设成对数刻度。这个操作能显著改善箱体和须线的对称性否则大部分数据会被压在最下面看起来全是离群点。3. 数据准备与boxplot基础调用拿到手就能跑的动手流程3.1 三种数据组织方式怎么选用MATLAB画盒图第一个要决定的是数据怎么放进boxplot函数。主要有三种组织方式它们分别对应不同的实验场景。组织方式示例结构适用场景注意点数值矩阵data(m, n)每列一组每组样本量相同缺数要补NaN向量分组变量data是一列group是等长的分组标签每组样本量不同、最通用标签顺序影响图顺序cell数组{group1; group2; ...}每个元素是一个向量从Excel/CSV读入的不等长数据空数组会报错如果你是从Excel或者别人给你的原始数据整理最常见的其实是“向量分组变量”这种长表格式。比如你有一列60个数值下面分三个处理组每组20个那就用repmat生成分组变量。这种形式最大的好处是不要求各组样本量相等20、20、25都没问题。数值矩阵的好处是很直观矩阵有几列图里就有几个盒子。缺点是如果有一组数据缺了几个样本你得把矩阵补齐成矩形用NaN占位。NaN在画图时会被忽略但如果你不会用NaN容易把数据弄错。cell数组则更自由每个元素放一个不等长的向量即可适合从readcell或者readtable出来的数据。3.2 最小可运行示例直接上一个我平时测试用的模板。这里用randn生成三组模拟正态数据模拟的是“对照组、处理组1、处理组2”的实验结构。rng(2024); % 固定随机种子保证每次运行结果可复现 groupA normrnd(3, 1.2, [50, 1]); groupB normrnd(5, 0.8, [50, 1]); groupC normrnd(4, 1.5, [50, 1]); data [groupA, groupB, groupC]; figure(Color, w); h boxplot(data, Labels, {对照, 处理组1, 处理组2}, ... Whisker, 1.5, ... Widths, 0.5); ylabel(观测值); title(三组样本的盒图对比); grid on;这段代码里面rng(2024)是关键。如果随机数种子不固定你每次运行得到的图都不同后来想复现就麻烦了。写论文的时候模拟数据和抽样过程固定种子更是好习惯很多期刊开始要求“可重复性”一个固定的随机种子至少能让你的结果稳定。Widths, 0.5控制的是箱体宽度默认是0.5宽度太大会让盒子挤在一起太小则显得单薄。3.3 返回句柄的作用很多人只写boxplot(data)不接收返回的句柄图出来觉得丑又没法批量调格式。实际上boxplot返回的h是一个hggroup数组每个盒子对应一个句柄里面包含这个盒子相关的所有线段、离群点标记等对象。你可以用一条命令把图里所有线的粗细统一改掉set(findobj(gca, Type, Line), LineWidth, 1.2);这行代码的意思是在当前坐标轴里找到所有Line类型的对象把线宽统一设成1.2。配合findobj(h, Type, Line)也可以效果类似。这是我在格式化时用得最多的招数比一个一个线的属性去设置省事得多。4. 论文级格式定制把MATLAB默认图打磨成可直接投稿的图4.1 配色方案默认蓝到底行不行MATLAB默认的蓝色在屏幕上看着还行但很多期刊是黑白印刷或灰度印刷默认蓝和旁边的红、黄在转成灰度后区分度很差。所以投稿用的盒图我倾向于两种路线一种是单色黑灰另一种是低饱和度的跨组配色。单色黑灰比较省心把所有盒子的边框设为深灰箱体用浅灰填充或不填充。如果你想用彩色区分组别建议选一组色盲友好的配色比如蓝色、橙色、绿色饱和度不要拉满。RGB值可以给一个参考角色RGB效果组1主色0.200.450.70深蓝组2主色0.850.500.15橙色组3主色0.350.700.40绿色离群点灰色0.450.450.45中性灰在boxplot里指定颜色可以直接用Colors, c参数c是一个N×3矩阵每一行对应一组颜色。配合BoxStyle, filled可以把箱体填充成该颜色。但要注意BoxStyle设为filled后离群点符号如果也用同样颜色可能会“糊”在填充色里面看不清。这种情况下把离群点颜色单独改成深色或白色边框会有帮助。4.2 线宽、字体、离群点标记的精细化设置线宽方面MATLAB默认的线条比较细打印出来容易“断掉”。期刊一般要求线条清晰推荐把主线条设在1.0到1.5之间。我的做法是先统一调用一个脚本set(gca, FontName, Times New Roman, FontSize, 9); set(gca, LineWidth, 0.8); set(findobj(gca, Type, Line), LineWidth, 1.0); set(findobj(gca, Type, Patch), LineWidth, 1.0);字体建议直接用Times、Arial或Helvetica这种英文通用字体。如果你的期刊要求中文可以考虑中文字体但要保证导出后字体被嵌入。离群点的默认十字标记比较小可以改成圆圈并放大一点h boxplot(data, Labels, {对照, 处理组1, 处理组2}, ... Symbol, o, OutlierSize, 6, ... Colors, c); % 单独把离群点改成半透明灰色 outliers findobj(h, Tag, Outliers); set(outliers, MarkerEdgeColor, [0.4 0.4 0.4], ... MarkerFaceColor, none, LineWidth, 0.8);MATLAB会给盒图内部的对象分配一些Tag比如Box、Median、Whisker、Outliers、AdjacentValue等。用findobj(h, Tag, Outliers)可以把所有离群点对象一次性找出来改样式。这个技巧在精细调节时非常有用。坐标轴范围也别忽略。盒图的须线有时候会贴着坐标轴边界显得很挤。我给纵轴留出5%到10%的空余用ylim微调并设置刻度数量ylim([0 8]); yticks(0:1:8);4.3 导出格式与画布尺寸投稿系统一般接受EPS、PDF、TIFF。MATLAB导出矢量格式最稳的方式是几条组合拳set(gcf, Units, centimeters, Position, [1 1 8.8 6.6]); set(gcf, PaperPositionMode, auto); print(gcf, -depsc2, BoxPlot_final.eps); exportgraphics(gcf, BoxPlot_final.pdf, ContentType, vector);图幅宽度我是按期刊排版习惯来定的单栏图宽度一般在8.6cm左右双栏图在17.5cm左右。高度根据内容调整不要做成正方形也不要做得过长。导出的字要和图的比例匹配字号最好在7pt到10pt之间太小了印出来看不清太大又显得笨重。如果你用exportgraphics导PDF矢量模式能保证所有线条文字在放大后依然清晰这是我很推荐的方式。5. 分组盒图、散点叠加与显著性标注多组对比的进阶姿势5.1 用分组变量处理复杂实验设计单因素多水平的盒图很简单但真实的论文图往往更复杂。比如你有两个分组因素性别和干预处理每组样本量还不一样这时候就要用“分组变量”形式。MATLAB支持把多个分组变量打包成cell数组传入x [randn(30,1)1; randn(35,1)3; randn(28,1)1.5; randn(32,1)3.5]; gender [repmat({雄}, 30,1); repmat({雄}, 35,1); ... repmat({雌}, 28,1); repmat({雌}, 32,1)]; treatment [repmat({对照}, 30,1); repmat({处理}, 35,1); ... repmat({对照}, 28,1); repmat({处理}, 32,1)]; boxplot(x, {gender, treatment}, ColorGroup, gender, ... Colors, [0.2 0.45 0.7; 0.85 0.5 0.15], ... Widths, 0.6); xlabel(性别 × 处理); ylabel(观测值);ColorGroup会让属于同一分组变量的组别共用颜色这样图例解释起来很方便。但要注意多分组变量的盒图默认排列顺序容易让初学者晕——它会把第一个分组变量的第一水平、第二水平排在横轴的不同位置具体顺序受到数据排列和分组变量输入顺序的影响。画完之后记得检查横轴标签必要时手动调整分组变量的顺序或者用ReorderGroup类参数重新排列。5.2 在盒图上叠散点补充展示原始数据的分布盒图的一个小缺点是它不直接展示样本量和每个原始点的位置。当样本量不大时我强烈建议在盒图上叠加半透明散点。这样既保留了盒图的统计概括力又让审稿人能看到原始数据的分布密度。hold on; for k 1:3 xjitter k (rand(size(data(:,k))) - 0.5) * 0.15; hsc scatter(xjitter, data(:,k), 8, [0.6 0.6 0.6], filled); hsc.MarkerFaceAlpha 0.35; end这里给散点加了很小的随机抖动避免相同数值的点完全重叠看不见。抖动宽度一般不超过0.3否则点会跑到别的组去。如果数据点很多比如每组五十个以上叠加散点会显得很拥挤这时候就不要硬叠了盒图本身已经足够。5.3 显著性标注的手动绘制期刊里常见的做法是在两组盒图之间画一条括号线顶部加星号或者p值。MATLAB没有现成的“自动显著性括号”函数我都是手动加。思路很简单先确定括号的纵坐标位置再画三条短线最后写text。ylim([0 9]); hold on; y1 7.5; y2 y1 0.2; plot([1 2], [y1 y1], k-, LineWidth, 1); plot([1 1], [y1 y2], k-, LineWidth, 1); plot([2 2], [y1 y2], k-, LineWidth, 1); text(1.5, y2 0.05, *, FontSize, 12, ... HorizontalAlignment, center);如果比较的组别很多括号会层层叠叠。我的做法是只标注达到显著性水平的比较并且把星号换成p值文字放在图注里而不是往图上塞十几个括号。多组比较还要注意多重检验问题星号的标记含义要在图注里写清楚对应哪种检验和校正方法。6. 我踩过的坑与排查思路盒图绘制中的真实问题6.1 等长矩阵配NaN导致的空盒子有一次我整理一批数据每组样本量不齐我图省事直接把三列数据拼成了一个矩阵长度不够的列自动补了NaN。结果画出来的图上第三组的盒子中间是空的看起来特别奇怪。排查之后发现该列有效数据只剩几个了其余的NaN全部被boxplot忽略盒子自然就画不出来。遇到这种情况第一件事不是改图而是检查数据量sum(isnan(data))如果某列有效样本太少盒图的统计意义就很弱。解决方法是改用“向量分组变量”或cell数组让每组用自己的长度不要用NaN硬填。另外如果从Excel里读取数据空单元格会被读成NaN最好先在数据预处理阶段看清楚哪些行缺失别让缺失值悄悄改变盒图形态。6.2 离群点太多、符号叠成一片怎么办离群点多不代表数据有问题有时候是数据天生偏态。比如一组浓度数据跨越三个数量级不用对数坐标时盒图几乎是贴着零轴的一条线上面全是离群点。这种图最容易被审稿人吐槽。我的处理思路是分三步先判断数据是否需要变换取对数能显著改善偏态的就取对数如果不取对数就把离群点符号改成小空心圈透明度调低让重叠点也能看出密度最后在正文里诚实地说明离群点的定义和数量。千万不要为了图好看直接把Whisker改成5或者10把所有点都藏进须线里。这种操作属于数据误导审稿人一旦用原始数据复现印象分会掉得很厉害。6.3 字体、线宽在Word/PPT里变形的坑MATLAB里画好的图放到Word里有时候会发现字变小了、线变细了或者文字变成了一个个方块。这通常有两个原因一是字体没有嵌入二是导出的是位图而不是矢量图。位图在缩放时线条和字体都会糊我一般至少导出PDF矢量版用于文字排版或者用-depsc2导出EPS后再转成PDF。中文字体在我这边的经验是能避开就尽量避开。论文图里的标注用英文或者中文都可以但MATLAB导出对中文字体嵌入的支持不算省心。如果期刊允许我会用英文标签如果必须显示中文我会把图形用高分辨率PNG导出并且检查文字是否为乱码。还有一个小细节Word文档编辑时矢量EPS图如果被其他工具二次转换线条宽度可能被忽略最好在导出前就把LineWidth设置在1.0以上。6.4 坐标轴标签被截断、盒子被遮挡的收尾检查最后导图之前我会做一个几秒钟的“体检”缩放窗口看看标题和纵轴标签有没有被切掉盒子有没有重叠离群点有没有跑出坐标轴范围线宽在打印预览下是否清晰。exportgraphics导出的图往往和屏幕显示略有差异我习惯在导出后用看图软件打开检查一遍再缩放200%看边缘和文字。这一步很基础但省去了投稿后被打回的麻烦。盒图这件事画出来不难画好需要一点点经验积累。我自己从最开始只会boxplot(data)到现在能五分钟出一张可以直接投出去的图中间主要就是在配色、线宽、数据组织和导出格式这四个地方反复打磨。最后一个小建议在脚本开头固定随机种子和全局默认字体比如set(groot, defaultAxesFontName, Times New Roman)你后面每一个图的风格都会自动统一省掉很多重复劳动。