MATLAB三元相图(ternary plot)保姆级教程:从散点、等高线到气泡图,一篇文章搞定所有可视化需求
MATLAB三元相图全攻略从基础绘制到高级可视化技巧在科研数据可视化领域三元相图ternary plot因其能够直观展示三个变量之间的比例关系而广受欢迎。无论是材料科学中的组分分析、生态学中的物种分布研究还是化学工程中的相平衡研究三元相图都发挥着不可替代的作用。本文将带您从零开始全面掌握MATLAB中创建各类三元相图的技巧助您轻松应对各种数据可视化需求。1. 三元相图基础与STernary工具介绍三元相图是一种特殊的三角形坐标系图表能够同时展示三个变量的比例关系。每个数据点在图中的位置由三个变量的相对比例决定三个顶点分别代表100%的单一成分。这种图表特别适合展示成分数据比如材料科学中三种元素的合金比例生态学中三种物种的相对丰度化学中三种组分的混合物相态在MATLAB中虽然可以通过基础绘图函数手动创建三元相图但过程繁琐且容易出错。为此STernary工具应运而生它封装了三元相图的核心功能让用户能够通过简洁的代码实现专业级的可视化效果。安装STernary工具非常简单您可以通过以下两种方式获取MATLAB File Exchange下载% 在MATLAB命令窗口输入 web(https://www.mathworks.com/matlabcentral/fileexchange/127958-ternary)Gitee仓库克隆% 使用git命令克隆仓库 !git clone https://gitee.com/slandarer/matlab-ternary-plot.git安装完成后将工具路径添加到MATLAB搜索路径中即可开始使用addpath(path_to_STernary_folder);2. 创建基础三元相图使用STernary工具创建基础三元相图只需一行代码% 初始化三元相图 STA STernary();这行代码会创建一个标准的三元相图坐标系包含三个坐标轴A、B、C主网格线和次网格线刻度线和刻度标签默认的轴标签创建完成后我们可以通过set函数自定义图表的外观% 设置背景色为浅灰色 set(STA, Color, [0.95, 0.95, 0.95]); % 设置轴标签文本 set(STA, A_Label, String, Component A); set(STA, B_Label, String, Component B); set(STA, C_Label, String, Component C); % 设置A轴颜色为蓝色 set(STA, A_Axis, Color, [0, 0, 0.8], LineWidth, 2);STernary还支持将标签移动到三角形的侧面这在某些出版要求中更为常见STA.label2Side(); % 将标签移动到侧面3. 散点图与折线图绘制3.1 散点图绘制散点图是三元相图中最基本也是最常用的图表类型用于展示离散数据点的分布情况。使用STernary绘制散点图非常简单% 生成随机数据三个变量的和为1 A rand(1,50); B rand(1,50); C 1 - A - B; % 绘制散点图 STA.SScatter(A, B, C, 60, filled, CData, [0.2, 0.6, 0.8]);参数说明前三个参数是三个变量的值不需要归一化工具会自动处理第四个参数控制点的大小filled表示填充标记CData设置点的颜色3.2 折线图绘制折线图常用于展示成分变化趋势或相边界。STernary提供了SPlot函数专门用于绘制三元相图中的折线% 绘制三条从中心点出发的折线 STA.SPlot([0.33, 0.8], [0.33, 0.1], [0.34, 0.1], LineWidth, 2, Color, r); STA.SPlot([0.33, 0.1], [0.33, 0.8], [0.34, 0.1], LineWidth, 2, Color, g); STA.SPlot([0.33, 0.1], [0.33, 0.1], [0.34, 0.8], LineWidth, 2, Color, b); % 在中心点添加标记和文本 STA.SScatter(0.33, 0.33, 0.34, 100, filled, CData, [1,1,1], MarkerEdgeColor, k); STA.SText(0.33, 0.33, 0.34, Center Point, FontSize, 12, HorizontalAlignment, left);实用技巧当需要同时绘制多条不相连的折线时可以在数据中插入NaN来分隔线段避免使用循环% 创建多段折线数据 A [rand(1,5), nan, rand(1,5)]; B [rand(1,5), nan, rand(1,5)]; C 1 - A - B; % 绘制多段折线 STA.SPlot(A, B, C, LineWidth, 1.5, Color, [0.5, 0.5, 0.5]);4. 气泡图与凸包绘制4.1 气泡图绘制气泡图是在散点图基础上增加了第四个维度通常用气泡大小表示的可视化方式非常适合展示多维数据% 生成随机数据 n 30; A rand(1,n); B rand(1,n); C 1 - A - B; sz 50 200*rand(1,n); % 气泡大小 val rand(1,n); % 用于着色的值 % 绘制气泡图 STA.SBubblechart(A, B, C, sz, CData, val, MarkerEdgeColor, k); % 添加颜色条并设置配色 colorbar; colormap(jet);4.2 凸包绘制凸包Convex Hull用于展示数据点的分布范围特别适合比较不同组数据的分布区域% 生成三组模拟数据 rng(42); % 设置随机种子保证可重复性 Pnt1 mvnrnd([30,30,40], [15 0 0; 0 20 0; 0 0 12], 80); Pnt2 mvnrnd([50,20,30], [25 0 0; 0 15 0; 0 0 40], 80); Pnt3 mvnrnd([20,30,50], [35 0 0; 0 20 0; 0 0 30], 80); % 数据归一化 Pnt1 STA.SNorm(Pnt1); Pnt2 STA.SNorm(Pnt2); Pnt3 STA.SNorm(Pnt3); % 绘制散点 STA.SScatter(Pnt1(:,1), Pnt1(:,2), Pnt1(:,3), 40, filled, MarkerFaceColor, [0.4,0.76,0.65]); STA.SScatter(Pnt2(:,1), Pnt2(:,2), Pnt2(:,3), 40, filled, MarkerFaceColor, [1,0.55,0.38]); STA.SScatter(Pnt3(:,1), Pnt3(:,2), Pnt3(:,3), 40, filled, MarkerFaceColor, [0.55,0.63,0.8]); % 绘制凸包 STA.SConvhull(Pnt1(:,1), Pnt1(:,2), Pnt1(:,3), [0.4,0.76,0.65], FaceAlpha, 0.2, EdgeColor, [0.4,0.76,0.65].*0.7); STA.SConvhull(Pnt2(:,1), Pnt2(:,2), Pnt2(:,3), [1,0.55,0.38], FaceAlpha, 0.2, EdgeColor, [1,0.55,0.38].*0.7); STA.SConvhull(Pnt3(:,1), Pnt3(:,2), Pnt3(:,3), [0.55,0.63,0.8], FaceAlpha, 0.2, EdgeColor, [0.55,0.63,0.8].*0.7); % 添加图例 legend({Group 1, Group 2, Group 3, Hull 1, Hull 2, Hull 3}, Location, bestoutside);5. 等高线图与高级技巧5.1 基础等高线图等高线图能够直观展示三元系统中某个属性的分布情况如密度、浓度等% 生成随机数据 A rand(1,100); B rand(1,100); C 1 - A - B; % 绘制填充等高线图 STA.SContourf(A, B, C, [], 15, LineWidth, 1); % 设置配色 colormap(parula); colorbar;5.2 自定义等高线层级有时我们需要控制等高线的具体层级可以分两步实现% 第一步计算核密度并获取Z值范围 [~, Z] STA.SContourf(A, B, C, [], 15, Visible, off); % 第二步根据Z值范围自定义层级并绘制 levels linspace(0.5, max(Z(:)), 10); STA.SContourf(A, B, C, [], levels, LineWidth, 1); STA.SContour(A, B, C, [], levels, LineWidth, 1.5, EdgeColor, k); % 添加散点标记原始数据位置 STA.SScatter(A, B, C, 30, filled, CData, [1,1,1], MarkerEdgeColor, k); % 设置配色 colormap(hot);5.3 数据归一化技巧STernary提供了两种数据归一化方法SNorm将每列数据线性映射到[0,1]区间data_normalized STA.SNorm(original_data);SNormByLim根据指定的范围进行归一化% 假设A列范围[0,50], B列[0,60], C列[0,40] data_normalized STA.SNormByLim(original_data, [0,50,0,60,0,40]);这种方法特别适合处理已知理论范围但实际数据未达到边界的情况。6. 实用技巧与常见问题解决6.1 图表导出最佳实践为了获得高质量的出版级图片建议使用以下设置导出图表% 设置图形尺寸和分辨率 fig gcf; fig.Units inches; fig.Position [0 0 8 6]; % 8英寸宽6英寸高 % 导出为PDF矢量图适合进一步编辑 exportgraphics(fig, ternary_plot.pdf, ContentType, vector); % 导出为PNG高分辨率位图 exportgraphics(fig, ternary_plot.png, Resolution, 600);6.2 常见问题排查数据点显示在三角形外确保三个变量的和接近1允许少量浮点误差使用STA.SNorm进行归一化处理等高线图显示不完整增加网格划分点数SContourf的第四个参数确保有足够的数据点建议至少50个图例显示异常确保将需要显示的图形句柄传递给legend函数对于等高线图使用Visible,off获取Z值时不会创建额外图例项6.3 高级自定义技巧自定义刻度标签set(STA, A_TickLabelStr, {Low, Medium, High}); set(STA, B_TickLabelStr, {20%, 40%, 60%, 80%, 100%});调整网格线密度% 设置主网格线位置 set(STA, GridValues, 0:25:100); % 设置次网格线位置 set(STA, MinorGridValues, 0:10:100);组合多种图表类型% 在同一坐标系中组合散点、等高线和凸包 STA.SContourf(A1, B1, C1, [], 10, LineWidth, 1); STA.SScatter(A2, B2, C2, 50, filled, MarkerFaceColor, r); STA.SConvhull(A3, B3, C3, b, FaceAlpha, 0.1, EdgeColor, b);掌握这些技巧后您将能够轻松创建专业级的三元相图有效展示复杂的三元系统数据。无论是学术论文、技术报告还是项目演示这些可视化方法都能显著提升您数据的表现力和说服力。