基于MATLAB的箱型图绘制与数据分析实战
除了'Labels'外,还可通过分组变量传递语义信息:利用此机制可轻松实现鸢尾花数据集等经典分类数据的可视化。
简介:箱型图(Boxplot)是一种用于展示数据分布情况的统计图表,能够直观呈现最小值、下四分位数、中位数、上四分位数和最大值,并识别异常值。在MATLAB中,通过内置的 boxplot 函数可高效实现箱型图的绘制。本资源提供一个经过测试的MATLAB代码实例,涵盖数据准备、图形绘制、样式自定义、标签添加及图像保存等完整流程,适用于科研、工程和教学中的多组数据分布比较与可视化分析,帮助用户快速掌握箱型图的实际应用方法。
1. 箱型图基本概念与统计意义
箱型图(Box Plot),又称盒须图或箱线图,是一种用于展示数据分布特征的统计图表。它通过五数概括法——最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值——直观呈现数据的集中趋势、离散程度以及潜在异常值。箱体部分覆盖了中间50%的数据范围,即四分位距(IQR = Q3 - Q1),而上下“须”则延伸至正常范围内的极值点,通常定义为 $ Q1 - 1.5 \times IQR $ 和 $ Q3 + 1.5 \times IQR $,超出该边界的点被视为异常值并单独标记。
% 示例:生成一组随机数据并绘制基础箱型图
data = normrnd(50, 10, 100, 1); % 正态分布数据,均值50,标准差10
boxplot(data);
title('基础箱型图示例');
该图不仅能快速识别偏态分布(如中位数偏离箱体中心),还可用于多组数据间的分布对比,广泛应用于质量控制、金融风险分析和生物医学研究等领域。相较于直方图,箱型图在小样本下仍能有效反映数据结构,是探索性数据分析(EDA)中的核心工具之一。
2. MATLAB中箱型图绘制原理
箱型图在MATLAB中的实现不仅依赖于直观的绘图函数调用,更深层次地涉及其底层数学构造机制、图形系统架构以及统计工具的支持。理解这些核心要素有助于开发者和研究人员精确控制可视化输出,并为后续高级定制与工程集成奠定坚实基础。本章将深入剖析MATLAB如何从原始数据出发,通过一系列数学计算与图形渲染流程生成标准箱型图,并揭示其背后的技术逻辑。
2.1 箱型图的数学构造机制
箱型图的本质是基于五数概括(Five-number Summary)构建的统计图形,即最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值。这五个关键数值构成了箱体与须线的基本框架。在MATLAB中, boxplot 函数首先对输入数据进行排序并执行分位数估计,进而确定异常值边界,最终完成图形元素定位。这一过程看似简单,实则包含多个技术细节,尤其是在处理非整数位置分位点时采用的插值策略,直接影响结果的准确性。
2.1.1 四分位数计算方法与插值策略
四分位数的准确计算是箱型图正确性的前提。MATLAB默认使用 线性插值法 来估算 Q1 和 Q3,尤其当样本量无法被4整除时,必须通过插值得到非整数索引处的值。以一个长度为 $ n $ 的有序数组 $ x_{(1)}, x_{(2)}, \dots, x_{(n)} $ 为例:
-
第一四分位数(Q1)对应的位置为:
$$
i = \frac{n+1}{4}
$$ -
第三四分位数(Q3)对应的位置为:
$$
i = \frac{3(n+1)}{4}
$$
若该位置不是整数,则需在相邻两个数据点之间进行线性插值。
示例代码:手动计算四分位数
% 输入数据
data = [10, 15, 18, 20, 22, 25, 30, 35, 40];
% 排序(确保有序)
sorted_data = sort(data);
n = length(sorted_data);
% 计算Q1和Q3的位置(基于(n+1)比例)
pos_Q1 = (n + 1) / 4;
pos_Q3 = 3 * (n + 1) / 4;
% 插值获取Q1
floor_Q1 = floor(pos_Q1);
ceil_Q1 = ceil(pos_Q1);
if floor_Q1 == ceil_Q1
Q1 = sorted_data(floor_Q1);
else
weight = pos_Q1 - floor_Q1;
Q1 = sorted_data(floor_Q1) * (1 - weight) + sorted_data(ceil_Q1) * weight;
end
% 插值获取Q3
floor_Q3 = floor(pos_Q3);
ceil_Q3 = ceil(pos_Q3);
if floor_Q3 == ceil_Q3
Q3 = sorted_data(floor_Q3);
else
weight = pos_Q3 - floor_Q3;
Q3 = sorted_data(floor_Q3) * (1 - weight) + sorted_data(ceil_Q3) * weight;
end
% 输出结果
fprintf('Q1: %.2f\n', Q1);
fprintf('Q3: %.2f\n', Q3);
逐行解读分析 :
sort(data):确保数据按升序排列,这是所有分位数计算的前提。(n + 1)/4:MATLAB使用的分位数位置公式之一,偏向于经验分布函数的逆变换。floor和ceil配合小数权重实现线性插值,避免直接舍入带来的偏差。- 权重
weight = pos - floor(pos)表示从小数部分提取距离前一点的比例。
| 样本量 $n$ | Q1位置 $(n+1)/4$ | 实际Q1值(插值后) |
|---|---|---|
| 9 | 2.5 | $ (15 + 18)/2 = 16.5 $ |
| 10 | 2.75 | $ 15 + 0.75×(18−15) = 17.25 $ |
| 11 | 3 | 直接取第3个元素 |
此表展示了不同样本量下Q1的计算方式差异,说明插值策略的重要性。
此外,MATLAB还支持多种分位数算法(可通过 quantile 函数指定),但在 boxplot 内部通常固定使用上述方法,保证一致性。
分位数计算对比流程图(Mermaid)
graph TD
A[原始数据] --> B[排序]
B --> C{样本量n}
C -->|n mod 4 ≠ 0| D[计算非整数位置]
C -->|n mod 4 == 0| E[直接取中间点]
D --> F[线性插值]
E --> G[返回Q1/Q3]
F --> H[输出连续型四分位数]
G --> H
该流程图清晰表达了MATLAB在处理四分位数时的决策路径,强调了插值环节的关键作用。
2.1.2 异常值判定规则:1.5倍IQR准则
一旦获得 Q1 和 Q3,便可计算四分位距(Interquartile Range, IQR):
\text{IQR} = Q3 - Q1
根据Tukey提出的“1.5倍IQR”规则,定义正常数据范围如下:
- 下界(Lower Fence):$ Q1 - 1.5 \times \text{IQR} $
- 上界(Upper Fence):$ Q3 + 1.5 \times \text{IQR} $
任何低于下界或高于上界的点均被视为潜在异常值(outlier),并在箱型图中以单独符号(如‘+’或‘o’)标出。
MATLAB中异常值检测代码示例
% 给定数据
data = [10, 12, 14, 15, 16, 18, 20, 22, 25, 30, 50];
% 计算四分位数
Q1 = quantile(data, 0.25);
Q3 = quantile(data, 0.75);
IQR = Q3 - Q1;
% 定义异常值边界
lower_fence = Q1 - 1.5 * IQR;
upper_fence = Q3 + 1.5 * IQR;
% 找出异常值
outliers = data(data < lower_fence | data > upper_fence);
% 显示结果
fprintf('Q1=%.2f, Q3=%.2f, IQR=%.2f\n', Q1, Q3, IQR);
fprintf('异常值边界: [%.2f, %.2f]\n', lower_fence, upper_fence);
disp('检测到的异常值:');
disp(outliers);
参数说明与逻辑分析 :
quantile(data, 0.25):调用MATLAB内置函数计算精确分位数,比手动插值更稳健。1.5 * IQR:经典阈值设定,平衡灵敏度与误报率。- 条件判断
data < lower_fence | data > upper_fence使用向量化操作高效筛选异常点。- 返回的
outliers是一个向量,可用于后续标记或剔除。
| 数据集 | Q1 | Q3 | IQR | Lower Fence | Upper Fence | 异常值 |
|---|---|---|---|---|---|---|
| [1,2,3,4,5,6,7,8,9,10,25] | 3.25 | 7.75 | 4.5 | -3.5 | 14.5 | 25 |
| [10,12,…,30,50](上例) | 15 | 25 | 10 | 0 | 40 | 50 |
该表格验证了50作为孤立高值被成功识别为异常值。
值得注意的是,虽然1.5倍IQR是最常用的标准,但某些领域(如金融风控)可能采用更严格的3倍IQR作为“极端异常值”判断依据。MATLAB允许用户通过修改 'whisker' 参数来自定义这个乘数因子,例如设置 'whisker', 3 可扩展须线长度。
2.1.3 中位数与均值的位置关系及其解释意义
箱型图中的中位数(Q2)是一条贯穿箱体的横线,代表数据的中心趋势。它与算术平均值(均值)之间的相对位置可揭示分布形态特征:
- 中位数 ≈ 均值 :提示数据近似对称分布(如正态分布)
- 中位数 < 均值 :表明存在右偏(正偏态),少数极大值拉高均值
- 中位数 > 均值 :表示左偏(负偏态),少数极小值拉低均值
这种对比对于识别非对称性和异常影响极为重要。
可视化中位数与均值差异的代码示例
% 生成右偏数据(对数正态分布)
rng(1); % 控制随机种子
lognormal_data = exp(randn(1, 100));
% 绘制箱型图
figure;
boxplot(lognormal_data, 'Labels', {'Lognormal Data'});
hold on;
% 添加均值点(红色三角形)
mean_val = mean(lognormal_data);
plot(1, mean_val, 'r^', 'MarkerSize', 8, 'MarkerFaceColor', 'r');
% 添加图例
legend('Median (from boxplot)', 'Mean', 'Location', 'northeast');
title('Comparison of Median and Mean in Right-Skewed Distribution');
ylabel('Value');
grid on;
执行逻辑说明 :
exp(randn(...))构造典型的右偏分布。boxplot自动显示中位数线(箱体内粗线)。plot(1, mean_val, ...)在x=1处叠加均值点,便于比较。- 红色向上三角形增强视觉区分度。
![示意图:中位数低于均值,箱体上半部分更长]
此图明确展示出:尽管中位数位于箱体中央附近,但由于尾部大值的存在,均值显著上移,反映出强烈的正偏态特性。
进一步地,在多组比较中,若某组的均值明显偏离中位数,应警惕是否存在未察觉的异常值或测量误差。
2.2 MATLAB图形系统基础架构
MATLAB的图形系统建立在一个面向对象的句柄体系之上,每个图形元素都对应一个可操控的对象。理解这一结构对于深度定制箱型图至关重要。 boxplot 函数并非仅输出静态图像,而是生成一组具有层级关系的图形对象,包括坐标轴、线条、标记等,均可通过句柄访问和修改。
2.2.1 图形句柄体系与绘图层次结构
MATLAB采用 父子关系模型 组织图形对象。顶层是 Figure 对象,其子对象为 Axes ,再往下是各种 Line 、 Text 、 Patch 等基本绘图单元。 boxplot 在执行时会在当前坐标轴内创建多个此类对象,并返回主句柄数组。
获取并操作箱型图句柄的完整示例
% 创建测试数据
groupA = randn(50,1) + 2;
groupB = randn(50,1) + 2.5;
data = {groupA, groupB};
% 调用boxplot并获取句柄
h = boxplot(data, 'Labels', {'Group A', 'Group B'});
% 查看返回句柄类型
disp(class(h)); % 输出: cell 数组
% 遍历查看各组件句柄
for i = 1:length(h)
if ~isempty(h{i})
fprintf('Component %d: %s\n', i, class(h{i}));
end
end
返回句柄说明 (典型结构):
h{1}:Whisker lines(须线)h{2}:Box edges(箱体边框)h{3}:Median line(中位数线)h{4}:Outliers(异常值标记)h{5}:Mean option(若启用)h{6}:Notch lines(若有凹槽)
利用这些句柄,可以精细化调整样式。例如:
% 修改中位数线颜色为红色,加粗
set(h{3}, 'Color', 'r', 'LineWidth', 2);
% 修改箱体填充色
arrayfun(@(x) set(x, 'FaceColor', [0.8 0.8 1]), h{2});
参数解释 :
set(obj, 'Property', value)是通用属性修改命令。arrayfun用于批量处理h{2}中可能包含的多个patch对象。
图形对象层次结构(Mermaid 流程图)
graph BT
F[Figure] --> A[Axes]
A --> L1[Line: Whiskers]
A --> P1[Patch: Box Body]
A --> L2[Line: Median]
A --> S1[Scatter: Outliers]
A --> T1[Text: Labels]
此图揭示了 boxplot 输出的内部组成,帮助开发者理解哪些元素可独立定制。
2.2.2 boxplot 函数内部调用流程解析
尽管用户只需一行代码即可调用 boxplot ,其内部却经历复杂的数据预处理与对象生成流程。
内部流程分解(伪代码形式)
function h = boxplot(data, varargin)
% 步骤1:解析输入参数
parsed_args = parse_inputs(data, varargin);
% 步骤2:清洗数据(去除NaN)
clean_data = remove_nan(parsed_args.data);
% 步骤3:按组别分离数据
groups = split_into_groups(clean_data, parsed_args.grouping);
% 步骤4:每组独立计算五数概括
stats = cellfun(@compute_five_number_summary, groups, 'UniformOutput', false);
% 步骤5:确定坐标轴范围与布局
xlims = determine_x_axis_layout(length(groups));
ylims = find_global_y_range([stats{:}]);
% 步骤6:绘制图形对象
h = create_graphic_elements(stats, xlims, ylims, parsed_args.style_options);
% 步骤7:应用样式与标签
apply_labels_and_decorations(h, parsed_args.labels, parsed_args.title);
% 返回句柄
outputHandl = pack_handles(h);
end
逻辑分析 :
parse_inputs处理 Name-Value 参数,如'notch', truecellfun实现分组统计的向量化运算create_graphic_elements调用底层绘图命令(line, patch等)- 最终打包句柄供外部修改
该流程体现了MATLAB函数设计的模块化思想,也为开发者提供了干预接口。
2.2.3 静态绘图与对象导向绘图模式的区别
| 特性 | 静态绘图模式 | 对象导向绘图模式 |
|---|---|---|
| 调用方式 | boxplot(data) |
h = boxplot(data) |
| 是否可后期修改 | 有限(依赖gca/gcf) | 完全可控(通过句柄) |
| 性能 | 快速出图 | 略慢但灵活 |
| 适用场景 | 快速探索性分析 | 发表级图表定制 |
| 可编程性 | 低 | 高 |
推荐科研与工程实践中优先使用对象导向模式,以便实现自动化脚本生成高质量图像。
2.3 统计工具箱依赖与环境配置要求
2.3.1 是否需要Statistics and Machine Learning Toolbox支持
答案是肯定的 :标准 boxplot 函数属于 Statistics and Machine Learning Toolbox,不属于MATLAB基础发行版。这意味着:
-
若未安装该工具箱,调用
boxplot将报错:Undefined function 'boxplot' for input arguments of type 'double'. -
替代方案包括:
- 使用开源替代包(如 File Exchange 上的
simple_boxplot) - 手动调用基础绘图命令重构
检查工具箱是否安装的代码
% 检查Statistics Toolbox是否存在
if ~license('test', 'Statistics_Toolbox') && ~license('test', 'Statistics_and_Machine_Learning_Toolbox')
warning('Statistics Toolbox is not available. Using fallback method.');
% 启动手动绘制方案
else
boxplot(data);
end
参数说明 :
license('test', ...)查询许可证状态,适用于大多数商业版本。
2.3.2 不同MATLAB版本对 boxplot 功能的支持差异
| MATLAB版本 | 支持情况 | 新增特性 |
|---|---|---|
| R2010a 及以前 | 初始版本 | 基础箱型图 |
| R2014b | 图形系统重写(HG2) | 支持透明度、现代配色 |
| R2017a | 引入 boxchart 类 |
更轻量、无需Toolbox |
| R2020b | boxplot 支持 tiledlayout |
多图排版优化 |
注意:
boxchart是 R2017a 起新增的类,可在无Toolbox情况下使用,但功能较弱。
使用 boxchart 的兼容性示例
% 兼容性更好的选择(无需Toolbox)
if verLessThan('matlab', '9.4') % pre-R2018a
warning('Using legacy boxplot with Toolbox');
boxplot(data);
else
figure;
bx = boxchart(data);
title('Box Chart without Statistics Toolbox');
end
2.3.3 替代方案:使用低级绘图命令手动构建箱型图
当缺乏工具箱时,可通过 line , patch , plot 等命令重建箱型图。
手动绘制单组箱型图代码
% 数据准备
data = randn(100,1)*10 + 50;
Q1 = quantile(data, 0.25);
Q3 = quantile(data, 0.75);
median_val = median(data);
IQR = Q3 - Q1;
whisker_length = 1.5 * IQR;
lower_whisker = max(min(data), Q1 - whisker_length);
upper_whisker = min(max(data), Q3 + whisker_length);
% 绘图
figure;
ax = axes;
hold(ax, 'on');
% 绘制箱体(矩形)
patch([1 1 1.1 1.1], [Q1 Q3 Q3 Q1], [0.7 0.7 1], ...
'EdgeColor', 'k', 'FaceAlpha', 0.5);
% 绘制中位数线
line([0.95 1.15], [median_val median_val], 'Color', 'r', 'LineWidth', 2);
% 绘制须线
line([1.05 1.05], [Q1 lower_whisker], 'Color', 'k');
line([1.05 1.05], [Q3 upper_whisker], 'Color', 'k');
line([0.95 1.15], [lower_whisker lower_whisker], 'Color', 'k');
line([0.95 1.15], [upper_whisker upper_whisker], 'Color', 'k');
% 标记异常值
outliers = data(data < lower_whisker | data > upper_whisker);
plot(ones(size(outliers)), outliers, '+r', 'MarkerSize', 8);
% 设置坐标轴
xlim([0.5 1.5]);
ylabel('Values');
title('Manually Constructed Box Plot');
xticks([]);
grid on;
优势 :
- 完全脱离Toolbox依赖
- 可自由设计样式(如圆角箱体、渐变填充)
- 易于嵌入GUI或Web应用
此方法虽繁琐,但在资源受限环境中极具价值。
3. 数据准备与可视化实现
在进行箱型图绘制之前,必须对输入数据的结构、格式和组织方式进行系统性梳理。MATLAB 中的 boxplot 函数虽然接口简洁,但其背后依赖于严格的数据逻辑模型。只有当原始数据被正确地组织成符合统计绘图要求的形式时,才能确保图形输出既准确又具备可解释性。本章将深入探讨不同类型数据的组织策略、分组变量的设计原则,并结合具体代码示例展示如何从原始观测值逐步构建出可用于可视化的标准输入格式。此外,还将详细解析 boxplot 函数的基本调用语法及其参数控制机制,为后续高级定制化打下坚实基础。
3.1 输入数据格式规范
在 MATLAB 环境中使用 boxplot 函数进行数据可视化时,首要任务是理解其对输入数据格式的要求。不同类型的输入结构会直接影响图形的生成方式和语义表达。常见的输入形式包括向量、矩阵以及配合分组变量使用的复合结构。每种形式都有其特定的应用场景和技术细节,合理选择可以显著提升分析效率与结果清晰度。
3.1.1 向量型数据的组织方式与适用场景
向量型数据是最基本的输入形式,适用于单组样本的分布展示。当研究对象仅涉及一个变量集合(例如一组学生的考试成绩)时,直接传入一个数值向量即可完成绘图。这种模式下,MATLAB 将整个向量视为单一数据组,自动计算五数概括并绘制对应的箱体与须线。
% 示例:单组学生考试成绩的箱型图
scores = [85, 76, 92, 68, 88, 73, 95, 81, 79, 87, 90, 74, 83, 77, 89];
figure;
boxplot(scores);
title('学生考试成绩分布');
ylabel('分数');
上述代码中, scores 是一个 $1 \times 15$ 的行向量,代表某班级15名学生的数学考试成绩。调用 boxplot(scores) 后,MATLAB 自动识别该向量为一组独立样本,并基于其内部排序计算 Q1、Q2(中位数)、Q3 及 IQR 值。上下“须”分别延伸至满足 $[Q1 - 1.5 \times IQR, Q3 + 1.5 \times IQR]$ 范围内的最远点,超出部分标记为异常值(以“+”符号显示)。
逻辑分析如下:
- 第1行定义了一个包含15个整数的成绩向量;
- 第3行创建新的图形窗口,避免覆盖已有图像;
- 第4行调用 boxplot 函数,MATLAB 内部执行以下步骤:
1. 对 scores 进行升序排序;
2. 使用线性插值法计算第一四分位数(Q1)和第三四分位数(Q3);
3. 计算 IQR = Q3 - Q1;
4. 确定正常范围边界:下限 = Q1 - 1.5×IQR,上限 = Q3 + 1.5×IQR;
5. 找出最小值和最大值是否落在该范围内,否则视为离群点;
6. 绘制箱体(从Q1到Q3),中位数线位于箱内,须线连接至极限值。
此方法的优势在于简单直观,适合教学演示或初步探索性数据分析(EDA)。然而,它无法处理多组比较问题,也无法表达类别信息。因此,在实际科研或工程应用中,往往需要更复杂的结构来承载更多信息。
3.1.2 矩阵型数据按列绘制的默认行为分析
当需要同时比较多个变量或多个实验条件下的数据分布时,矩阵型输入成为首选方案。MATLAB 的 boxplot 函数默认将矩阵的每一列视为一个独立的数据组,并沿水平方向并列绘制多个箱型图。
% 示例:三门课程成绩对比
data_matrix = [
85, 78, 90; % 学生1
76, 82, 85; % 学生2
92, 88, 94; % 学生3
68, 70, 75; % 学生4
88, 85, 89 % 学生5
];
figure;
boxplot(data_matrix);
set(gca, 'XTickLabel', {'数学', '英语', '物理'});
title('各科成绩分布对比');
ylabel('分数');
在这个例子中, data_matrix 是一个 $5 \times 3$ 的二维数组,其中每列对应一门课程的所有学生成绩。函数调用后,MATLAB 自动生成三个并排的箱型图,分别表示数学、英语和物理三门课的成绩分布。
| 列索引 | 对应科目 | 数据含义 |
|---|---|---|
| 1 | 数学 | 所有学生数学成绩 |
| 2 | 英语 | 所有学生英语成绩 |
| 3 | 物理 | 所有学生物理成绩 |
该设计体现了“按列分组”的核心原则: 每一列构成一个独立的统计组 。若用户希望按行分组,则需转置矩阵或采用其他编码方式。
值得注意的是,如果矩阵中含有缺失值(NaN), boxplot 会自动忽略这些值而不影响整体绘图。这一特性使得它非常适合处理真实世界中的不完整数据集。
graph TD
A[原始数据矩阵] --> B{是否存在NaN?}
B -- 是 --> C[自动过滤NaN]
B -- 否 --> D[直接提取每列]
C --> D
D --> E[计算各列的五数概括]
E --> F[绘制多个箱型图]
F --> G[输出图形对象句柄]
如上流程图所示,MATLAB 在接收到矩阵输入后,首先检测是否存在缺失值;若有,则剔除后再进行统计计算。这保证了即使某些测量值缺失,其余有效数据仍可用于可视化分析。
3.1.3 分组变量(grouping variable)的设计与编码原则
对于非结构化或多因子分类数据,单纯使用矩阵已不足以表达复杂的分组关系。此时引入“分组变量”(grouping variable)是一种高效解决方案。分组变量是一个与主数据向量长度相同的标签向量,用于指定每个观测值所属的类别。
% 示例:不同教学方法的效果评估
teaching_methods = {'A', 'A', 'B', 'B', 'A', 'B', 'A', 'B'}';
scores_by_method = [85, 76, 92, 68, 88, 73, 95, 81]';
figure;
boxplot(scores_by_method, teaching_methods);
set(gca, 'XTickLabel', {'方法A', '方法B'});
title('不同教学方法下的学生成绩分布');
ylabel('分数');
在此案例中, scores_by_method 是一个包含8个成绩的列向量,而 teaching_methods 是一个细胞数组,记录每个成绩对应的教学方法。通过将这两个变量一同传入 boxplot ,MATLAB 能够根据标签自动归类数据并生成两个箱型图。
| 观测编号 | 成绩 | 教学方法 | 归属组 |
|---|---|---|---|
| 1 | 85 | A | 方法A |
| 2 | 76 | A | 方法A |
| 3 | 92 | B | 方法B |
| 4 | 68 | B | 方法B |
| … | … | … | … |
分组变量不仅可以是字符串,也可以是数值或分类类型(categorical)。推荐使用 categorical 类型以提高性能和可读性:
method_cat = categorical(teaching_methods, {'A','B'}, {'传统教学','互动教学'});
boxplot(scores_by_method, method_cat);
set(gca, 'XTickLabel', categories(method_cat));
这种方法不仅增强了语义表达能力,还便于后期与其他统计函数(如 anova1 或 fitrm )集成使用。
综上所述,合理的数据组织是成功绘制箱型图的前提。向量适用于单组分析,矩阵适合多变量横向比较,而分组变量则提供了灵活的分类支持。掌握这三种基本格式,能够应对绝大多数常见应用场景。
3.2 boxplot 函数的基本调用语法
掌握了数据格式之后,下一步是熟悉 boxplot 函数的具体调用方式。该函数具有高度灵活性,既能快速生成默认图表,也能通过参数配置实现精细控制。本节将系统讲解其基本语法结构,并结合实例说明如何实现单组绘图、多组并列显示以及处理非均衡样本等问题。
3.2.1 单组数据绘图示例与输出解读
最简单的调用形式仅需提供一个数值向量作为输入:
x = randn(100,1); % 标准正态分布随机数
figure;
h = boxplot(x);
title('标准正态分布样本的箱型图');
ylabel('值');
该代码生成100个服从标准正态分布的随机数,并绘制其箱型图。返回值 h 是一个图形句柄数组,包含所有绘图元素(如箱体、中位线、须线、异常点等)的对象引用,可用于后续样式修改。
参数说明:
- x : 输入数据,必须为数值向量或矩阵;
- h : 输出句柄,类型为 GraphicsPlaceholder 数组,可通过索引访问各个组件。
输出图形中各元素的统计意义如下:
- 底部横线 :下须末端,表示最小非异常值;
- 箱体底边 :第一四分位数(Q1);
- 箱体内横线 :中位数(Q2);
- 箱体顶边 :第三四分位数(Q3);
- 顶部横线 :上须末端,表示最大非异常值;
- “+”符号 :超出 1.5×IQR 范围的异常值。
该图可用于判断数据是否对称。若中位数接近箱体中心且上下须长度相近,则分布近似对称;反之则可能存在偏态。
3.2.2 多组数据并列显示的技术路径
当需要比较多个组别时,可以通过矩阵或多变量输入实现并列绘图:
group1 = randn(50,1) + 1;
group2 = randn(50,1);
group3 = randn(50,1) - 1;
data = [group1, group2, group3];
figure;
boxplot(data, 'Labels', {'实验组', '对照组', '低剂量组'});
title('三组实验数据分布对比');
ylabel('响应值');
此处 data 是一个 $50 \times 3$ 的矩阵,每列表示一组实验结果。选项 'Labels' 用于自定义 x 轴标签,增强可读性。
该技术广泛应用于临床试验、生物实验和质量控制等领域,能直观反映不同处理条件之间的差异趋势。
3.2.3 利用细胞数组(cell array)处理非均衡样本组
当各组样本数量不一致时,无法直接使用矩阵存储。此时应采用细胞数组:
group_A = [85, 76, 92, 88];
group_B = [78, 82, 85, 70, 80, 84];
group_C = [90, 94, 89];
data_cell = {group_A, group_B, group_C};
labels = {'A班', 'B班', 'C班'};
figure;
boxplot(data_cell, 'Labels', labels);
title('班级间成绩分布比较(非均衡样本)');
ylabel('分数');
细胞数组允许每个单元格存放任意长度的向量,完美解决了样本不等长的问题。这是处理真实调查数据或现场采集数据的常用技巧。
3.3 参数设置与图形属性控制
3.3.1 常用可选参数列表:’whisker’, ‘orientation’, ‘notch’等
boxplot 支持丰富的 Name-Value 参数用于定制外观:
boxplot(data_cell, ...
'Whisker', 1.0, ... % 修改须线倍数为1.0×IQR
'Orientation', 'horizontal', ... % 水平方向绘制
'Notch', 'on', ... % 启用凹槽显示置信区间
'Labels', labels);
title('带凹槽的水平箱型图');
xlabel('分数');
| 参数名 | 可选值 | 功能描述 |
|---|---|---|
'Whisker' |
正实数(默认1.5) | 设置须线长度倍数 |
'Orientation' |
'vertical' , 'horizontal' |
控制图形方向 |
'Notch' |
'on' , 'off' |
是否显示凹槽(用于比较中位数差异) |
凹槽(notch)表示中位数的置信区间,若两组凹槽无重叠,表明中位数差异显著(p < 0.05)。
3.3.2 缺失值(NaN)的自动处理机制
MATLAB 自动忽略 NaN 值:
data_with_nan = [85, NaN, 92, 68, 88, NaN, 95];
boxplot(data_with_nan); % NaN 被自动跳过
无需预处理即可安全绘图,极大简化了数据清洗流程。
3.3.3 自定义标签与分组名称传递方法
除了 'Labels' 外,还可通过分组变量传递语义信息:
species = repmat({'Setosa', 'Versicolor', 'Virginica'}, 50, 1);
measures = [randn(50,1), randn(50,1)+1, randn(50,1)+2];
boxplot(measures(:), species, 'Labels', unique(species));
利用此机制可轻松实现鸢尾花数据集等经典分类数据的可视化。
4. 图形定制化与高级分析集成
在数据可视化过程中,标准的箱型图虽然能够有效传达基本统计信息,但在实际科研和工程应用中,往往需要对图表进行深度定制以满足出版级质量要求或特定分析场景的需求。MATLAB 提供了高度灵活的图形控制机制,允许用户从颜色、线条样式到注释元素进行全面调整,并支持将箱型图与其他统计分析工具无缝集成。通过合理配置图形属性、增强标记语义以及精细化管理坐标系统,可以显著提升图表的信息密度与视觉表达力。本章深入探讨如何利用 MATLAB 的高级绘图功能实现箱型图的个性化设计,并结合实际案例展示其在复杂数据分析中的整合能力。
4.1 箱体线条与颜色样式调整
箱型图的视觉表现直接影响其可读性和专业性。默认样式的单一色彩和线型可能难以适应多组对比或多维度呈现的场景。通过对箱体边框、中位线、填充色及凹槽结构的精细调控,不仅可以提高图表美观度,还能强化不同数据组之间的区分度。MATLAB 的 boxplot 函数支持多种 Name-Value 参数输入方式来修改这些视觉属性,同时也可以借助返回的图形句柄进一步操作底层对象。
4.1.1 使用Name-Value对修改边框与中位线颜色
在调用 boxplot 函数时,可通过指定 'Color' 或 'MedianColor' 等参数直接设定关键线条的颜色。例如,在比较多个实验条件下的性能分布时,为每组设置不同的主色调有助于快速识别趋势。
% 示例:使用Name-Value参数自定义边框与中位线颜色
data = {randn(100,1)+1, randn(100,1)-1, randn(100,1)*1.5}; % 三组数据
figure;
h = boxplot(data, 'Color', 'k', 'MedianColor', 'r', 'Whisker', 1.5);
set(gca, 'XTickLabel', {'Group A', 'Group B', 'Group C'});
title('Customized Box Plot with Red Median Lines');
代码逻辑逐行解读:
- 第2行:生成三组正态分布数据,分别代表不同实验组;
- 第4行:调用
boxplot,其中'Color','k'设置所有箱体边框为黑色;'MedianColor','r'将中位线统一设为红色;'Whisker',1.5明确使用经典的1.5倍IQR规则确定须长; - 第5行:设置x轴标签,使分组名称更具可读性;
- 第6行:添加标题说明当前图为定制化箱型图。
该方法适用于全局风格统一的场合,但若需为每一组单独配色,则应结合后续批量设置策略。
此外,颜色选择建议遵循无障碍设计原则(如避免红绿搭配),并优先采用 ColorBrewer 等科学配色方案以保证印刷一致性。
| 参数名 | 可选值类型 | 功能描述 |
|---|---|---|
'Color' |
字符串/RGB向量 | 控制箱体外框及须的颜色 |
'MedianColor' |
字符串/RGB向量 | 设置中位线颜色 |
'MeanStyle' |
'target' , 'line' , 'none' |
决定是否显示均值及其样式 |
'Symbol' |
字符串 | 自定义异常值标记符号(如’o’,’+’) |
参数说明扩展:
-'Color'若用于矩阵或多组数据,默认应用于所有组别;如需差异化处理,必须通过句柄访问个体组件。
-'MedianColor'在版本 R2020a 后引入,此前只能通过获取Line对象后手动修改。
graph TD
A[输入数据] --> B{是否多组?}
B -- 是 --> C[构建cell array]
B -- 否 --> D[直接传入向量]
C --> E[调用boxplot函数]
D --> E
E --> F[解析Name-Value参数]
F --> G[绘制初始图形]
G --> H[返回图形句柄h]
H --> I[通过set/get修改细节属性]
I --> J[输出最终图像]
此流程图展示了从数据准备到图形渲染的完整路径,强调了句柄机制在后期定制中的核心作用。
4.1.2 批量设置不同组别的填充色与透明度(FaceColor, Alpha)
当存在多个分组时,使用填充色能更直观地区分各组箱体。虽然 boxplot 不直接支持 per-group 填充色参数,但可通过其返回的句柄集合遍历每个“Box”对象并设置 'FaceColor' 和 'FaceAlpha' 属性实现渐变或分类着色。
% 示例:为每组箱体设置不同填充色与透明度
data = {randn(80,1), randn(80,1)+0.5, randn(80,1)-0.5};
colors = [0.2 0.6 1; 1 0.4 0.4; 0.3 0.7 0.3]; % RGB颜色矩阵
alpha = 0.3; % 透明度
figure;
h = boxplot(data, 'Notch','off');
% 遍历每个箱体,设置填充色
boxes = findobj(h, 'Tag', 'Box'); % 查找所有Box图形对象
for i = 1:length(boxes)
set(boxes(i), 'FaceColor', colors(i,:), 'FaceAlpha', alpha, 'EdgeColor','k');
end
set(gca, 'XTickLabel', {'Control', 'Treatment 1', 'Treatment 2'}, ...
'FontSize', 12);
title('Multi-colored Box Plots with Transparency');
xlabel('Groups'); ylabel('Values');
逻辑分析与参数解释:
- 第5–6行:定义三种柔和色调用于区分三组数据,
alpha=0.3实现半透明效果,便于重叠观察; - 第9行:调用
boxplot绘制基础图形,返回句柄数组h; - 第12行:使用
findobj根据标签'Box'定位所有箱体矩形对象; - 第14行:循环中依次设置每个箱体的面颜色、透明度及边框颜色;
'FaceAlpha'是 OpenGL 渲染模式下有效的属性,需确保图形窗口支持硬件加速。
扩展技巧:
若需同步更改中位线粗细,可查找 Tag 为'Median'的线条对象:matlab medians = findobj(h, 'Tag', 'Median'); for i = 1:length(medians) set(medians(i), 'LineWidth', 2); end
这种基于对象的编程范式体现了 MATLAB 图形系统的对象导向特性,极大增强了定制自由度。
| 属性名 | 类型 | 作用范围 | 推荐取值示例 |
|---|---|---|---|
FaceColor |
RGB三元组 | 箱体内部填充色 | [0.8 0.8 1] 浅蓝 |
FaceAlpha |
数值 (0~1) | 透明度 | 0.2 ~ 0.5 轻微透底 |
EdgeColor |
颜色标识符/RGB | 边框颜色 | 'k' 黑色轮廓 |
LineWidth |
数值 | 线条宽度 | 1.5 更清晰可见 |
4.1.3 凹槽箱型图(notched box plot)的启用与解释
凹槽箱型图(Notched Box Plot)是一种增强版箱型图,其中箱体中部被切出一个“V”形缺口,用于表示中位数的置信区间。两个箱体的凹槽若不重叠,则初步表明它们的中位数具有统计学差异(p < 0.05)。这对于非参数比较非常有用,尤其适合小样本或非正态分布数据。
% 示例:创建带凹槽的箱型图并解释中位数差异
data = {lognrnd(0,0.5,[50,1]), exprnd(2,[50,1]), normrnd(1.5,0.8,[50,1])};
groupLabels = {'Log-normal', 'Exponential', 'Normal'};
figure;
h = boxplot(data, 'Notch', 'on', 'Labels', groupLabels, ...
'Color', 'b', 'MedianLineStyle', '-', 'Whisker', 1.5);
title('Notched Box Plot: Visual Test for Median Differences');
ylabel('Response Time (s)');
grid on;
逐行解析:
- 第2行:生成三种典型偏态分布数据,模拟响应时间测量;
- 第5行:
'Notch','on'激活凹槽功能,MATLAB 自动计算中位数的95%置信区间; 'MedianLineStyle','- '强调中位线为实线以便于识别;- 结果图中若两组凹槽无交集,则暗示中位数显著不同。
统计背景补充:
凹槽宽度由公式估算:
$$
\text{Notch radius} \approx 1.58 \times \frac{\mathrm{IQR}}{\sqrt{n}}
$$
此近似基于正态分布假设下的抽样误差估计,因此在极端偏态或样本量过小时应谨慎解读。
flowchart LR
Start[开始绘制凹槽箱型图] --> LoadData[加载分组数据]
LoadData --> CheckSampleSize{n ≥ 20?}
CheckSampleSize -- Yes --> EnableNotch["设置 'Notch','on'"]
CheckSampleSize -- No --> Warn[警告:小样本可能导致误判]
EnableNotch --> RenderPlot[渲染图形]
RenderPlot --> Interpret[检查凹槽重叠情况]
Interpret --> Conclusion{凹槽是否重叠?}
Conclusion -- 否 --> Significant[中位数差异显著]
Conclusion -- 是 --> NotSignificant[无显著差异]
该流程图指导用户在使用凹槽箱型图时进行合理的判断决策,避免过度依赖视觉判断而忽略统计前提。
综上所述,通过对箱体线条、颜色、填充与结构特征的系统性定制,不仅可以提升图形的专业水准,更能辅助完成初步的统计推断任务。这种“形式服务于内容”的设计理念正是高质量科研可视化的精髓所在。
4.2 标记元素与注释增强
箱型图的核心优势在于简洁地概括数据分布,但有时仅靠图形本身不足以传达完整的分析结论。加入额外的标记元素(如均值点、异常值高亮)和文本注释(如样本量、p值)可大幅提升图表的信息承载能力。MATLAB 支持在绘图后叠加多种图形元素,实现多层次的数据叙事。
4.2.1 异常值标记符号与大小调节
默认情况下, boxplot 使用红色“+”号标记异常值,但这一样式可能不符合期刊格式要求。通过 'Symbol' 参数可更换标记形状,亦可通过句柄调整其大小与颜色。
% 自定义异常值标记样式
data = randn(100,1)*2;
data(end+1) = 10; % 插入一个明显离群点
figure;
h = boxplot(data, 'Symbol', 'o', 'MarkerSize', 6, 'MarkerFaceColor', 'r');
title('Outliers Marked with Filled Circles');
ylabel('Measurements');
'Symbol','o'将标记改为圆圈;'MarkerSize',6增大标记尺寸;'MarkerFaceColor','r'实心填充红色,提高辨识度。
应用场景: 在生物重复实验中,常用空心圆表示潜在技术误差,实心圆表示生物学显著变异。
4.2.2 添加均值点以辅助判断分布形态
中位数反映中心位置,但均值更能体现偏态影响。可在箱体上方叠加均值点,揭示偏斜方向。
% 在箱型图上添加均值点
data = exprnd(2, [60,1]); % 指数分布,右偏
mean_val = mean(data);
figure;
boxplot(data);
hold on;
plot(1, mean_val, 'd', 'MarkerSize', 8, 'MarkerFaceColor', 'm', 'DisplayName', 'Mean');
hold off;
legend show;
title('Box Plot with Mean Diamond (Right-skewed Data)');
紫色菱形清晰标出均值高于中位数,直观显示右偏特征。
4.2.3 利用 text 和 annotate 添加统计信息文本框
将关键统计量嵌入图中,避免读者反复对照表格。
% 添加包含样本量和IQR的文本框
data = normrnd(0,1,[75,1]);
[iqr_val, q1, q3] = iqr(data); % 计算IQR
n = length(data);
figure;
boxplot(data);
txt = sprintf('n = %d\nIQR = %.2f\nQ1=%.2f, Q3=%.2f', n, iqr_val, q1, q3);
annotation('textbox', [0.6, 0.7, 0.2, 0.1], 'String', txt, ...
'FontSize', 10, 'BackgroundColor', 'w', 'EdgeColor', 'k');
布局建议: 文本框置于右上角空白区,避免遮挡数据点;使用白色背景确保可读性。
此类增强手段使得单张图表即可独立支撑分析结论,广泛应用于论文插图与汇报材料中。
4.3 坐标轴与图例管理
良好的坐标系统设计是专业图表的基础。合理设置标签、字体、刻度与图例布局,不仅能提升可读性,还便于多图拼接与排版输出。
4.3.1 设置坐标轴标签、标题与字体属性
% 全面设置坐标轴属性
figure;
boxplot(randn(50,3), 'Labels',{'X1','X2','X3'});
xlabel('Experimental Conditions', 'FontSize', 14, 'FontWeight','bold');
ylabel('Standardized Score', 'FontSize', 14);
title('Performance Across Three Tasks', 'FontSize', 16, 'Interpreter','none');
set(gca, 'FontSize', 12, 'TickLabelInterpreter','latex');
支持 LaTeX 解释器渲染数学符号,如 \mu , \sigma 。
4.3.2 多组箱型图的图例生成与位置布局
对于按颜色或图案区分的多组数据,图例不可或缺。
% 创建双因素箱型图并添加图例
gender = [repmat('Male',60,1); repmat('Female',60,1)];
treatment = repmat({'Drug A'; 'Drug B'; 'Placebo'},40,1);
values = randn(120,1);
figure;
boxplot(values, {gender, treatment}, 'ColorGroup', gender);
legend('Location','northeastoutside','Title','Gender');
使用嵌套分组变量自动产生复合图例。
4.3.3 坐标轴范围控制与对数刻度应用
对于跨越数量级的数据,对数坐标必不可少。
% 对数刻度下的箱型图
data = 10.^randn(100,1); % 对数正态分布
figure;
boxplot(data);
set(gca, 'YScale', 'log');
ylabel('Concentration (log scale)');
注意:对数变换前应确认无零或负值。
以上章节展示了从基础样式调整到高级注释集成的完整路径,体现出 MATLAB 在科研可视化方面的强大灵活性与扩展潜力。
5. 综合应用与工程实践拓展
5.1 数据分布对比与科研可视化案例
在科学研究和工程实践中,箱型图因其强大的分布对比能力被广泛应用于多场景数据分析。通过并列展示不同组别的数据分布特征,研究者可以快速识别中心趋势变化、离散程度差异以及异常值的存在。
以 实验前后测量值的对比分析 为例,假设某药物干预研究对30名受试者在服药前(Pre)与服药后(Post)进行了血压测量。我们可以使用MATLAB将这两组数据组织为矩阵形式,并绘制横向并列箱型图:
% 模拟实验前后血压数据(单位:mmHg)
data_pre = 140 + 15*randn(30,1); % 服药前,均值较高
data_post = 128 + 12*randn(30,1); % 服药后,期望降低
% 合并数据并定义分组标签
combined_data = [data_pre; data_post];
group_labels = [repmat('Pre', 30, 1); repmat('Post', 30, 1)];
% 绘制箱型图
figure;
boxplot(combined_data, group_labels, ...
'Labels', {'Before Treatment', 'After Treatment'}, ...
'Notch', 'on', ... % 开启凹槽表示中位数置信区间
'Whisker', 1.5); % 标准IQR准则
title('Systolic Blood Pressure: Pre vs Post Intervention', 'FontSize', 14);
ylabel('Blood Pressure (mmHg)', 'FontWeight', 'bold');
set(gca, 'FontSize', 12);
该图不仅能直观反映治疗后的整体血压下降趋势,且“凹槽”重叠情况可用于粗略判断中位数差异是否显著——若凹槽不重叠,则提示可能存在统计学差异。
进一步地,在 多地区环境监测数据的空间分布可视化 中,可将全国7个城市的PM2.5日均浓度按月汇总后绘制成多组箱型图:
| 城市 | 样本量 | Q1 | Median | Q3 | IQR | 异常值数量 |
|---|---|---|---|---|---|---|
| 北京 | 365 | 48 | 72 | 105 | 57 | 12 |
| 上海 | 365 | 36 | 54 | 78 | 42 | 8 |
| 广州 | 365 | 33 | 50 | 70 | 37 | 6 |
| 成都 | 365 | 55 | 85 | 120 | 65 | 15 |
| 西安 | 365 | 50 | 76 | 108 | 58 | 10 |
| 深圳 | 365 | 30 | 46 | 68 | 38 | 5 |
| 武汉 | 365 | 45 | 69 | 98 | 53 | 9 |
% 加载城市PM2.5数据(假定已存储于cell数组cities_data中)
cities = {'Beijing','Shanghai','Guangzhou','Chengdu','Xi''an','Shenzhen','Wuhan'};
figure;
boxplot(cities_data, 'Labels', cities, 'Orientation', 'horizontal');
xlabel('PM2.5 Concentration (\mu g/m^3)');
title('Monthly PM2.5 Distribution Across 7 Major Chinese Cities');
grid on;
此类可视化有助于环保部门识别高污染区域及季节性波动特征。
在 临床试验疗效评估 中,还可结合分组变量区分治疗组与对照组,甚至叠加均值点以增强解读:
% 添加均值点(红+号)
hold on;
mean_values = [mean(group_A), mean(group_B)];
scatter(repmat(1:2, [length(mean_values),1]), mean_values, ...
'r+', 'LineWidth', 1.5, 'MarkerSize', 8);
上述方法已在多个医学期刊图表中标准化使用,提升了结果透明度与可重复性。
5.2 异常检测与质量监控中的深度应用
在工业自动化领域,箱型图是实现 实时离群点识别 的重要工具。传感器采集的数据流可通过滑动时间窗口分割,每个窗口内构建箱型图模型,动态标记超出 Q3 + 1.5×IQR 或低于 Q1 - 1.5×IQR 的读数为潜在故障信号。
例如,在轴承温度监控系统中:
% 模拟每小时采集的温度数据(共24小时)
temperature_data = 65 + 10*randn(1, 24);
outliers = [120, -10]; % 插入两个异常值
temperature_data([5, 15]) = outliers;
% 绘制带异常标记的箱型图
figure;
h = boxplot(temperature_data, 'Symbol', 'o', 'Whisker', 1.5);
set(h(end), 'MarkerFaceColor', 'r'); % 红色突出异常点
title('Bearing Temperature Monitoring with Outlier Detection');
ylabel('Temperature (°C)');
更进一步,可将箱型图的上下须边界作为 控制限(UCL/LCL) ,替代传统X-bar图的部分功能:
Q1 = prctile(temperature_data, 25);
Q3 = prctile(temperature_data, 75);
IQR = Q3 - Q1;
LCL = Q1 - 1.5*IQR;
UCL = Q3 + 1.5*IQR;
disp(['Control Limits: LCL = ', num2str(LCL), ', UCL = ', num2str(UCL)]);
对于 在线监测系统 ,可通过定时触发脚本更新图形:
while isrunning
new_data = read_sensor(); % 获取最新一批数据
update_boxplot(fig_handle, new_data); % 更新现有图形
pause(60); % 每分钟刷新一次
end
此机制已在智能制造产线的质量追溯系统中部署,实现缺陷早期预警。
5.3 图像导出与报告集成流程
高质量图像输出是科研成果传播的关键环节。在MATLAB中推荐使用 exportgraphics 函数保存为矢量格式,确保缩放无损:
fig = figure;
boxplot(data, 'Labels', labels);
title('Experimental Results Comparison');
% 导出为PDF/EPS用于LaTeX插入
exportgraphics(fig, 'results.pdf', 'ContentType', 'vector');
exportgraphics(fig, 'results.eps', 'ContentType', 'vector');
若需嵌入Word文档,可通过COM接口调用:
word = actxserver('Word.Application');
word.Visible = 1;
doc = word.Documents.Add;
range = doc.Content;
inlineShape = range.InlineShapes.AddPicture(fullfile(pwd, 'results.png'));
或先导出PNG高清图:
exportgraphics(fig, 'results.png', 'Resolution', 300);
标准LaTeX插入方式如下:
\begin{figure}[htbp]
\centering
\includegraphics[width=0.8\textwidth]{results.pdf}
\caption{Box plot comparison of experimental groups.}
\label{fig:boxplot}
\end{figure}
5.4 与其他统计函数的协同分析
为了提升分析效率,常将 boxplot 与数据预处理函数联动使用。例如利用 groupsummary 对分类数据自动聚合:
% 创建表格数据
tbl = table(groups, values);
summary_tbl = groupsummary(tbl, 'groups', {'mean','median','std'});
通过 boxplot 返回句柄提取底层统计数据:
h = boxplot(data, 'Notch', 'on');
% 提取中位数、四分位数等
positions = get(h, 'XData');
medians = get(h, 'YData'); % 注意结构需进一步解析
更高效的方案是结合 statregions 工具箱或自定义函数批量提取:
function stats = extract_boxplot_stats(data)
Q = quantile(data, [0.25 0.5 0.75]);
IQR = Q(3) - Q(1);
stats.Q1 = Q(1);
stats.Median = Q(2);
stats.Q3 = Q(3);
stats.LowerWhisker = max(min(data), Q(1)-1.5*IQR);
stats.UpperWhisker = min(max(data), Q(3)+1.5*IQR);
end
最终可构建自动化脚本,遍历多个数据集生成统一风格的系列箱型图与统计表,极大提高批处理报告生成效率。
简介:箱型图(Boxplot)是一种用于展示数据分布情况的统计图表,能够直观呈现最小值、下四分位数、中位数、上四分位数和最大值,并识别异常值。在MATLAB中,通过内置的 boxplot 函数可高效实现箱型图的绘制。本资源提供一个经过测试的MATLAB代码实例,涵盖数据准备、图形绘制、样式自定义、标签添加及图像保存等完整流程,适用于科研、工程和教学中的多组数据分布比较与可视化分析,帮助用户快速掌握箱型图的实际应用方法。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)