简介:在MATLAB 2018中,绘制双坐标图是数据可视化中的常见需求,尤其适用于展示不同量纲或量级的数据对比。本教程通过实际脚本“huatu20200105.m”,讲解如何创建双坐标轴、设置透明图例、加粗图框、调整图形大小与位置等关键操作。结合Excel数据源“040.xlsx”,帮助用户掌握完整的图形定制流程,提升图表的专业性与视觉表现力。适合希望提升MATLAB数据可视化能力的IT从业者和学习者。
1. MATLAB双坐标轴图制作方法
在数据可视化中,双坐标轴图是一种非常实用的展示方式,尤其适用于在同一图形中比较具有不同量纲或数量级的数据集。MATLAB提供了强大的绘图功能,支持通过 plotyy 和 yyaxis 等函数实现双Y轴图形的绘制。
-
plotyy(x1,y1,x2,y2):适用于较早版本的MATLAB,可同时绘制两条曲线,分别使用左右两个Y轴。 -
yyaxis left/yyaxis right:新版本推荐使用的方式,允许更灵活地控制左右Y轴,便于后续属性设置和图形优化。
通过本章学习,读者将掌握如何创建并美化双坐标轴图,为复杂数据的对比分析打下基础。
2. 使用gca和axes创建多坐标轴
在MATLAB中,图形用户界面(GUI)和数据可视化常常需要在同一图形窗口中展示多个独立的坐标轴,以便于对不同数据集进行对比分析。为此,MATLAB提供了 gca 和 axes 函数作为创建和管理多坐标轴的核心工具。本章将深入探讨这两个函数的功能,从基本操作到复杂应用,逐步引导读者掌握如何构建多坐标轴图形,并实现其交互控制与动态更新。
2.1 gca和axes函数的基本功能
在MATLAB中, gca 和 axes 是两个用于操作坐标轴对象的关键函数。它们在图形创建和管理中扮演着重要角色。
2.1.1 获取当前坐标轴句柄
gca 是 get current axes 的缩写,用于获取当前图形窗口中激活的坐标轴对象句柄。该函数在图形操作中非常常用,特别是在需要对当前坐标轴属性进行修改时。
ax = gca;
上述代码将返回当前坐标轴的句柄,并将其赋值给变量 ax 。一旦获取到句柄,就可以使用 set 或直接属性赋值的方式对坐标轴进行定制,例如修改坐标轴标签、调整范围、设置网格线等。
代码逻辑分析:
-
gca返回当前图形中“当前坐标轴”的句柄。 - 句柄是一个指向图形对象的引用,通过它可以访问和修改该对象的所有属性。
- 一旦获取了句柄,就可以使用
set(ax, 'PropertyName', PropertyValue)的方式修改属性。
参数说明:
-
ax:坐标轴对象的句柄。 -
PropertyName:坐标轴支持的任意属性名称,如'XLim'、'YLabel'等。 -
PropertyValue:指定属性的值。
2.1.2 创建新的坐标轴对象
与 gca 不同, axes 函数用于创建一个新的坐标轴对象,并将其添加到当前图形窗口中。通过指定位置和大小,可以灵活地控制新坐标轴的布局。
ax2 = axes('Position', [0.1 0.1 0.8 0.3]);
代码逻辑分析:
-
axes创建一个新的坐标轴对象。 -
'Position'属性定义了坐标轴在图形窗口中的位置和大小,其值是一个四元向量[left, bottom, width, height],单位为图形窗口的归一化比例。 -
ax2是新创建的坐标轴对象的句柄。
参数说明:
-
left:坐标轴左侧距离图形窗口左侧的归一化距离(0~1)。 -
bottom:坐标轴底部距离图形窗口底部的归一化距离。 -
width:坐标轴的宽度。 -
height:坐标轴的高度。
示例:创建两个独立坐标轴并绘制不同数据
figure;
% 创建第一个坐标轴并绘制正弦曲线
ax1 = axes('Position', [0.1 0.55 0.8 0.4]);
x = 0:0.1:2*pi;
y1 = sin(x);
plot(ax1, x, y1, 'b');
ylabel(ax1, 'Sine');
title(ax1, 'Sine Wave');
% 创建第二个坐标轴并绘制余弦曲线
ax2 = axes('Position', [0.1 0.1 0.8 0.4]);
y2 = cos(x);
plot(ax2, x, y2, 'r');
ylabel(ax2, 'Cosine');
xlabel(ax2, 'x (radians)');
流程图(mermaid):
graph TD
A[创建图形窗口] --> B[定义x数据]
B --> C1[创建第一个坐标轴]
B --> C2[创建第二个坐标轴]
C1 --> D1[绘制sin曲线]
C2 --> D2[绘制cos曲线]
D1 --> E1[设置标签和标题]
D2 --> E2[设置标签和标题]
2.2 多坐标轴图的创建流程
构建多坐标轴图的过程包括定义坐标轴的位置、设置属性、绑定数据等步骤。下面我们将逐步讲解如何创建一个包含多个坐标轴的图形。
2.2.1 定义坐标轴位置和大小
如前所述, axes 函数的 'Position' 属性是控制坐标轴布局的核心。通过设置不同的 Position 值,可以实现上下、左右、嵌套等多种布局方式。
表格:常见坐标轴布局参数
| 布局类型 | Position 值示例 | 描述 |
|---|---|---|
| 上半部分 | [0.1 0.55 0.8 0.4] | 占据图形窗口上半区域 |
| 下半部分 | [0.1 0.1 0.8 0.4] | 占据图形窗口下半区域 |
| 左半部分 | [0.1 0.1 0.35 0.8] | 占据图形窗口左半区域 |
| 右半部分 | [0.55 0.1 0.35 0.8] | 占据图形窗口右半区域 |
2.2.2 设置坐标轴属性和关联数据
除了位置,还可以设置其他属性如 'XLim' 、 'YLim' 、 'Color' 、 'Box' 等来增强图形的可读性和美观性。
ax3 = axes('Position', [0.1 0.1 0.8 0.4], ...
'XLim', [0 10], 'YLim', [-1 1], ...
'Color', 'none', 'Box', 'off');
代码逻辑分析:
-
'XLim'和'YLim':设置坐标轴的范围。 -
'Color','Box':设置坐标轴背景颜色和边框样式,常用于叠加坐标轴时去除背景干扰。 -
'Box', 'off':关闭坐标轴边框,使图形更简洁。
绑定数据示例:
x = 0:0.1:10;
y3 = sin(x) .* exp(-0.1*x);
plot(ax3, x, y3, 'k--');
xlabel(ax3, 'Time (s)');
ylabel(ax3, 'Damped Sine');
2.3 多坐标轴图的交互与控制
在实际应用中,我们经常需要对多个坐标轴进行联动控制,例如缩放、切换、动态更新等。MATLAB提供了灵活的句柄操作机制来实现这些功能。
2.3.1 坐标轴联动的实现
通过共享相同的缩放操作,可以实现多个坐标轴的联动效果。例如,当用户缩放一个坐标轴时,其他坐标轴也同步缩放。
linkaxes([ax1, ax2, ax3], 'x');
代码逻辑分析:
-
linkaxes函数用于同步多个坐标轴的缩放行为。 - 第二个参数
'x'表示仅同步 x 轴的缩放;也可以使用'xy'来同步 x 和 y 轴。
2.3.2 坐标轴切换与动态更新
在某些交互式应用中,可能需要动态切换当前坐标轴或更新其内容。可以通过 axes 函数激活特定坐标轴,再进行绘图操作。
axes(ax2);
cla; % 清除当前坐标轴内容
y_new = sin(x + pi/4);
plot(x, y_new, 'g');
代码逻辑分析:
-
axes(ax2)激活指定的坐标轴。 -
cla清空该坐标轴上的图形内容。 - 再次调用
plot实现内容更新。
2.4 实践案例:多数据集的并行可视化
在本节中,我们将结合前面所学内容,实现一个实际案例:在一个图形窗口中展示三个不同数据集,并分别控制其图形元素。
2.4.1 同一图形窗口中展示不同数据集
我们将绘制正弦、余弦和指数衰减正弦波,分别显示在三个不同的坐标轴中。
figure;
% 创建三个坐标轴
ax1 = axes('Position', [0.1 0.7 0.8 0.25]);
ax2 = axes('Position', [0.1 0.4 0.8 0.25]);
ax3 = axes('Position', [0.1 0.1 0.8 0.25]);
% 绘制正弦
plot(ax1, x, sin(x), 'b');
ylabel(ax1, 'sin(x)');
title(ax1, 'Sine Wave');
% 绘制余弦
plot(ax2, x, cos(x), 'r');
ylabel(ax2, 'cos(x)');
title(ax2, 'Cosine Wave');
% 绘制衰减正弦
plot(ax3, x, sin(x).*exp(-0.1*x), 'g');
ylabel(ax3, 'Damped');
xlabel(ax3, 'Time (s)');
title(ax3, 'Damped Sine');
2.4.2 图形元素的独立控制与协同展示
为了增强可读性,我们可以为每个坐标轴设置不同的背景颜色、字体大小等属性,并实现联动缩放功能。
set(ax1, 'Color', [0.95 0.95 1]);
set(ax2, 'Color', [0.95 1 0.95]);
set(ax3, 'Color', [1 0.95 0.95]);
linkaxes([ax1, ax2, ax3], 'x');
图表(表格):各坐标轴样式设置
| 坐标轴 | 背景色 | 标题颜色 | 线条颜色 |
|---|---|---|---|
| ax1 | 浅蓝 | 黑色 | 蓝色 |
| ax2 | 浅绿 | 黑色 | 红色 |
| ax3 | 浅黄 | 黑色 | 绿色 |
通过上述方法,我们不仅实现了多数据集的并行可视化,还通过样式设置和联动功能提升了图形的交互性和可读性。这在数据分析、科学可视化、教学演示等场景中具有重要应用价值。
本章内容从基础函数 gca 和 axes 的使用出发,逐步介绍了多坐标轴图的创建、布局、属性设置以及交互控制方法,并通过实践案例展示了其在实际数据可视化中的应用。下一章将聚焦图例透明度设置,以进一步提升图形的可读性与美观性。
3. 设置图例透明度提升可读性
图例在数据可视化中起着至关重要的作用,它不仅帮助观众理解图表中各条曲线或图形所代表的含义,还提升了整体图表的可读性和专业性。在复杂的多坐标轴图表中,图例往往容易被其他图形元素遮挡或干扰,特别是在背景颜色较深或图形密集的情况下。因此,合理设置图例的透明度,使其既能清晰呈现又不破坏整体视觉效果,是提升图表质量的重要手段之一。
本章将深入讲解如何在 MATLAB 中设置图例的透明度,优化其在复杂图表中的可读性,并通过实践案例展示图例透明化在多坐标轴图中的应用效果。
3.1 图例的基本配置
3.1.1 图例的位置与内容定义
图例的默认位置通常由 MATLAB 自动决定,以避免遮挡数据。然而在某些场景下,我们需要手动调整图例的位置以适应特定布局。MATLAB 提供了 legend 函数用于定义图例内容及其位置。
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
figure;
plot(x, y1, 'DisplayName', 'sin(x)');
hold on;
plot(x, y2, 'DisplayName', 'cos(x)');
legend('Location', 'northeastoutside');
- Location 参数说明 :
-
'north':图例位于图形顶部; -
'northeastoutside':图例位于图形外部右上角; -
'southwest':图例位于图形内部左下角; - 更多位置选项可查阅 MATLAB 官方文档。
3.1.2 图例的样式与字体设置
除了位置设置外,我们还可以对图例的字体、颜色、边框等进行自定义,以提升可读性和美观度。
lgd = legend('sin(x)', 'cos(x)', 'Location', 'northeastoutside');
set(lgd, 'FontSize', 12, 'FontName', 'Arial', 'TextColor', 'black', ...
'EdgeColor', 'gray', 'Box', 'on');
- 参数说明 :
-
'FontSize':设置字体大小; -
'FontName':设置字体类型; -
'TextColor':设置图例文字颜色; -
'EdgeColor':设置图例边框颜色; -
'Box':是否显示图例边框。
| 属性名 | 说明 | 常用取值 |
|---|---|---|
| FontSize | 字体大小 | 10、12、14 等 |
| FontName | 字体类型 | ‘Arial’、’Times New Roman’ 等 |
| TextColor | 图例文字颜色 | ‘black’、’white’、RGB 值等 |
| EdgeColor | 图例边框颜色 | ‘gray’、’none’、’red’ 等 |
| Box | 是否显示图例边框 | ‘on’、’off’ |
3.2 图例透明度的调整方法
3.2.1 利用Alpha参数控制透明度
MATLAB 中图例对象本身不直接支持透明度设置,但可以通过设置图例背景的 Alpha 值来实现透明效果。这需要通过获取图例对象的子对象(如背景矩形)来修改其属性。
figure;
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1, 'DisplayName', 'sin(x)');
hold on;
plot(x, y2, 'DisplayName', 'cos(x)');
lgd = legend('Location', 'northeastoutside');
% 获取图例背景对象
legendBackground = get(lgd, 'Children');
% 设置透明度(0.5 表示 50% 透明)
set(legendBackground(1), 'FaceAlpha', 0.5);
- 代码分析 :
-
lgd = legend(...):创建图例并获取图例句柄; -
get(lgd, 'Children'):图例对象包含多个子对象,第一个通常是背景; -
FaceAlpha:设置背景透明度,取值范围为[0, 1],0 为完全透明,1 为不透明。
3.2.2 透明图例对图形可读性的优化
透明图例特别适用于背景复杂或有背景图像的图表。通过设置适当的透明度,图例既能清晰显示又不会遮挡图表细节。
% 示例:添加背景图像
img = imread('background.jpg'); % 读取背景图像
image(img, 'Parent', gca); % 显示图像作为背景
axis image off; % 调整坐标轴以适应图像
% 绘图
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1, 'r', 'DisplayName', 'sin(x)');
hold on;
plot(x, y2, 'b', 'DisplayName', 'cos(x)');
% 添加透明图例
lgd = legend('Location', 'northeastoutside');
legendBackground = get(lgd, 'Children');
set(legendBackground(1), 'FaceAlpha', 0.6, 'FaceColor', 'w');
- 逻辑说明 :
- 添加背景图像后,图例如果不透明会完全遮挡图像,影响整体美观;
- 通过设置
FaceAlpha=0.6和FaceColor='w',使图例背景为半透明白色,既清晰又不影响背景图像。
3.3 图例与其他图形元素的协同设计
3.3.1 图例与坐标轴标签的布局协调
在多坐标轴图表中,图例的布局必须与坐标轴标签、标题等元素协调,避免视觉混乱。
figure;
[ax, h1, h2] = plotyy(1:10, rand(1,10), 1:10, rand(1,10)*100);
legend([h1, h2], 'Data1', 'Data2', 'Location', 'northoutside');
% 设置坐标轴标签
xlabel(ax(1), 'X Axis');
ylabel(ax(1), 'Data1');
ylabel(ax(2), 'Data2');
title('Dual Y-Axis Plot with Transparent Legend');
- mermaid 流程图展示逻辑 :
graph TD
A[创建双坐标轴] --> B[绘制数据]
B --> C[添加图例]
C --> D[设置坐标轴标签]
D --> E[添加标题]
E --> F[优化图例透明度]
3.3.2 图例透明化与背景图的结合应用
在学术论文或商业报告中,背景图常用于增强图表的视觉吸引力。此时图例若为不透明,可能会影响背景图像的呈现。
% 加载并显示背景图
bg = imread('chart_bg.png');
image(bg, 'Parent', gca);
axis image off;
% 绘图
x = 0:0.1:2*pi;
plot(x, sin(x), 'DisplayName', 'sin(x)');
hold on;
plot(x, cos(x), 'DisplayName', 'cos(x)');
% 添加图例并设置透明背景
lgd = legend('Location', 'southeast');
set(lgd, 'Box', 'on', 'EdgeColor', 'black');
legendBackground = get(lgd, 'Children');
set(legendBackground(1), 'FaceAlpha', 0.7, 'FaceColor', 'w');
- 关键点 :
- 使用
FaceAlpha控制图例背景的透明度; - 选择合适的
FaceColor以增强文字可读性; - 保持图例与背景图之间的对比度。
3.4 实践案例:复杂图表中图例的优化设计
3.4.1 在多坐标轴图中添加透明图例
在具有多个坐标轴的图表中,图例往往需要分别对应不同的数据系列,设置透明度可以避免图例遮挡其他坐标轴内容。
figure;
ax1 = axes;
plot(ax1, 1:10, rand(1,10), 'r-o', 'DisplayName', 'Series1');
ax2 = axes;
plot(ax2, 1:10, rand(1,10)*100, 'b-s', 'DisplayName', 'Series2');
linkaxes([ax1, ax2], 'x');
% 设置图例
lgd = legend([ax1.Children; ax2.Children], 'Series1', 'Series2', 'Location', 'northeastoutside');
set(lgd, 'FontSize', 12, 'EdgeColor', 'gray');
legendBackground = get(lgd, 'Children');
set(legendBackground(1), 'FaceAlpha', 0.5);
- 逻辑分析 :
- 使用
axes分别创建两个坐标轴对象; - 绘图时指定
DisplayName; - 使用
legend函数统一管理两个坐标轴的图例; - 设置透明度以增强可读性。
3.4.2 提升图例在密集图形中的可读性
当图表中存在大量数据线或标记点时,图例容易被遮挡或干扰。此时,设置图例透明度并搭配合适的背景色是优化手段之一。
figure;
for i = 1:10
plot(1:10, rand(1,10), 'DisplayName', ['Series ', num2str(i)]);
hold on;
end
lgd = legend('Location', 'southeast');
set(lgd, 'FontSize', 10, 'Box', 'on');
legendBackground = get(lgd, 'Children');
set(legendBackground(1), 'FaceAlpha', 0.6, 'FaceColor', 'w');
- 结果分析 :
- 图例背景为半透明白色,使得图例文字清晰可见;
- 即使图表中有多条曲线,图例仍能清晰区分每个系列;
- 避免图例完全遮挡下方图形内容。
小结(非总结性)
本章系统介绍了 MATLAB 中图例的基本配置方式,重点讲解了如何通过设置图例背景的透明度来提升图例在复杂图表中的可读性。通过代码示例和流程图的配合,展示了从基本设置到实际应用的完整流程。后续章节将继续探讨图形窗口的布局优化、边框设置、数据导入与可视化等进阶内容,帮助读者构建高质量的 MATLAB 图表。
4. 图框边框加粗设置技巧
在MATLAB中,图形窗口和坐标轴的边框是图形界面的重要组成部分。边框不仅可以定义图形的边界,还能在视觉上引导读者关注重点内容。尤其在学术论文、技术报告或演示文稿中,清晰、美观的边框设置往往能显著提升图表的专业性和可读性。
本章将从MATLAB图形边框的基本属性入手,逐步讲解如何使用 set 命令等技术手段实现边框加粗,并分析边框在视觉美观中的作用。最后,通过一个学术图表的实例,展示如何将边框加粗与其他图形元素结合,提升图表的整体表现力。
4.1 MATLAB图形边框的基本属性
在MATLAB中,图形对象(Figure)和坐标轴对象(Axes)都有自己的边框属性。这些属性包括线型、颜色和宽度,它们共同决定了边框的外观。理解这些基本属性是进行边框设置的前提。
4.1.1 图形窗口与坐标轴边框的结构
MATLAB的图形由两个主要对象组成:图形窗口(Figure)和坐标轴(Axes)。图形窗口是绘图的容器,而坐标轴是绘图内容的实际载体。两者都有边框属性:
- 图形窗口边框 :控制整个图形窗口的外边框。
- 坐标轴边框 :即坐标轴的四周框线,通常由
Box属性控制。
可以通过以下方式获取这些对象的句柄:
fig = gcf; % 获取当前图形窗口句柄
ax = gca; % 获取当前坐标轴句柄
4.1.2 边框线型、颜色与宽度的定义
边框的外观主要由以下几个属性控制:
| 属性名 | 含义 | 可选值示例 |
|---|---|---|
Color | 边框颜色 | 'k' (黑色)、 'r' (红色)等 |
LineStyle | 边框线型 | '-' (实线)、 '--' (虚线)等 |
LineWidth | 边框线宽(单位:像素) | 1、2、3 等 |
Box | 是否显示坐标轴边框 | 'on' 、 'off' |
这些属性可以通过 set 函数进行设置。例如,修改坐标轴边框宽度:
set(gca, 'LineWidth', 2);
📌 小贴士 :默认情况下,MATLAB的坐标轴边框线宽为0.5像素,视觉上较细。加粗边框通常会将线宽设为1.5或2像素。
4.2 边框加粗的具体实现
边框加粗的核心在于修改 LineWidth 属性。本节将详细介绍如何通过 set 命令分别设置图形窗口和坐标轴的边框,并提供代码示例说明其执行逻辑。
4.2.1 使用 set 命令修改坐标轴边框属性
我们可以通过获取坐标轴句柄并设置其属性来实现边框加粗:
% 创建一个示例图
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = exp(x/4);
figure;
plot(x, y1, 'b', x, y2, 'r');
% 获取当前坐标轴句柄并设置边框属性
ax = gca;
set(ax, ...
'Box', 'on', ... % 启用边框
'LineWidth', 2, ... % 边框线宽设为2
'Color', 'k'); % 边框颜色设为黑色
🔍 逐行分析 :
- 第1~4行:定义数据并绘图;
- 第6行:获取当前坐标轴句柄;
- 第7~9行:设置边框属性,包括启用边框、线宽和颜色。
执行上述代码后,可以看到图表的坐标轴边框明显变粗,视觉效果更清晰。
4.2.2 图形窗口边框的自定义设置
虽然图形窗口本身不直接提供边框宽度设置,但可以通过控制图形窗口的背景色与坐标轴边框的搭配来实现“视觉边框”的效果。例如:
% 设置图形窗口背景为浅灰色
set(gcf, 'Color', [0.95, 0.95, 0.95]);
% 设置坐标轴边框颜色与宽度
set(gca, 'Color', 'k', 'LineWidth', 2);
这样,坐标轴边框与浅色背景形成对比,产生视觉上的“外边框”效果。
🧩 进阶技巧 :可以使用
annotation函数手动添加矩形框作为“外边框”,实现更复杂的边框样式。
4.3 边框设置在图形美观中的作用
边框不仅是功能性的存在,它在视觉设计中也扮演着重要角色。合理设置边框可以增强图形的层次感、聚焦读者注意力,并提升整体图表的专业感。
4.3.1 强化图形视觉焦点
在多图排版或信息密集的图表中,清晰的边框可以帮助读者迅速定位每个图形的范围。加粗的边框能够突出图表主体,减少视觉混乱。
graph TD
A[原始图表] --> B[加粗边框图表]
B --> C{边框加粗}
C --> D[增强视觉焦点]
C --> E[提升阅读效率]
4.3.2 边框风格与图表主题的匹配
不同应用场景对图表风格有不同的要求:
| 应用场景 | 推荐边框风格 |
|---|---|
| 学术论文 | 黑色实线,线宽2px |
| 商业报告 | 深灰色实线,线宽1.5px |
| 数据看板 | 高对比度颜色,线宽2px |
例如,在学术图表中,建议统一使用黑色边框,并保持线宽一致,以符合出版标准。
4.4 实践案例:边框加粗在学术图表中的应用
在学术图表中,图形的规范性和一致性至关重要。边框的设置不仅影响美观,还可能影响图表是否被期刊接受。以下是一个完整的实践案例,展示如何将边框加粗与其他图形元素结合,制作符合学术标准的图表。
4.4.1 学术论文图表边框的标准化设置
% 示例数据
x = 0:0.1:10;
y1 = sin(x);
y2 = cos(x);
% 创建图形并设置边框
figure('Position', [100, 100, 600, 400], 'Color', 'w');
plot(x, y1, 'b', x, y2, 'r');
% 设置坐标轴边框
ax = gca;
set(ax, ...
'Box', 'on', ...
'LineWidth', 2, ...
'Color', 'k', ...
'FontSize', 12, ...
'FontName', 'Times New Roman');
% 添加图例与标签
legend({'sin(x)', 'cos(x)'}, 'Location', 'bestoutside', 'FontSize', 10);
xlabel('x', 'FontSize', 12, 'FontName', 'Times New Roman');
ylabel('y', 'FontSize', 12, 'FontName', 'Times New Roman');
title('Example of Academic Chart with Bold Border', 'FontSize', 14, 'FontName', 'Times New Roman');
📊 执行说明 :
- 设置图形窗口大小为600×400像素;
- 坐标轴边框为黑色、线宽2像素;
- 字体统一为 Times New Roman,字号标准化;
- 图例放置在图形外部,避免遮挡数据。
4.4.2 结合其他图形元素提升整体美观性
在上述代码基础上,我们可以进一步优化图表:
% 设置网格
grid on;
set(ax, 'GridLineStyle', '--', 'GridColor', [0.8, 0.8, 0.8]);
% 设置图例透明度
lgd = legend('show');
set(lgd, 'EdgeColor', 'none', 'BackgroundColor', [1, 1, 1, 0.7]);
🧩 逻辑分析 :
- 网格线设为浅灰色虚线,增强图表可读性;
- 图例背景设为半透明,避免遮挡数据曲线;
- 整体风格统一,适用于论文插图或技术报告。
总结
通过本章的学习,我们深入了解了MATLAB中图形窗口和坐标轴边框的基本属性,掌握了使用 set 命令进行边框加粗的具体实现方法。我们还探讨了边框在图形美观中的作用,并通过一个学术图表的完整示例展示了如何将边框设置与其他图形元素协同优化。
在后续章节中,我们将继续探索MATLAB图形的高级定制技巧,如图形窗口尺寸控制、图例透明度设置等,帮助您制作出更加专业、美观的图表作品。
5. 调整图形窗口大小与屏幕位置
在MATLAB中,图形窗口(figure)不仅是数据可视化的载体,更是图形输出与用户交互的核心。图形窗口的尺寸和屏幕位置直接影响用户的观察体验、图形展示的清晰度以及图形在报告、演示或GUI界面中的适配性。因此,掌握如何通过代码精确控制图形窗口的大小与位置,是提升MATLAB图形应用质量的关键技能之一。
本章将从figure对象的基本属性入手,逐步深入讲解如何通过Position属性控制图形窗口的尺寸与位置,如何通过脚本实现动态调整,并探讨图形窗口嵌入GUI界面和多窗口管理的技巧。最后通过一个完整的实例,展示如何根据实际输出需求灵活配置图形窗口布局。
5.1 figure对象与Position属性详解
在MATLAB中,每一个图形窗口都是一个figure对象。figure对象具有多个属性,其中 Position 是最关键的属性之一,用于定义图形窗口在屏幕上的尺寸和位置。
5.1.1 figure对象的创建与基本属性
使用 figure 命令可以创建一个新的图形窗口,其基本语法如下:
fig = figure;
此时,MATLAB会创建一个默认尺寸的图形窗口,并返回其句柄 fig 。该句柄可用于后续的属性设置和操作。
figure对象的常用属性包括:
| 属性名 | 含义说明 |
|---|---|
Position | 图形窗口的位置和大小 |
Units | 坐标单位(默认为’pixels’) |
Name | 图形窗口标题 |
NumberTitle | 是否显示窗口编号 |
MenuBar | 是否显示菜单栏 |
ToolBar | 是否显示工具栏 |
5.1.2 Position属性的参数结构与设置方法
Position 属性是一个长度为4的向量: [left, bottom, width, height] ,分别表示:
-
left:图形窗口左上角在屏幕水平方向的位置(单位由Units决定); -
bottom:图形窗口左上角在屏幕垂直方向的位置; -
width:图形窗口的宽度; -
height:图形窗口的高度。
示例:创建一个位于屏幕(100, 200)位置,尺寸为800×600像素的图形窗口:
fig = figure('Position', [100, 200, 800, 600]);
⚠️ 注意:如果未指定
Units属性,MATLAB默认以像素(’pixels’)为单位。你也可以将Units设为’defaults’、’normalized’、’inches’、’centimeters’等单位,以满足不同的需求。
5.2 动态调整图形窗口尺寸与位置
在实际应用中,图形窗口的尺寸和位置可能需要根据运行环境、用户交互或数据展示需求进行动态调整。MATLAB提供了多种方式实现动态控制。
5.2.1 使用set命令修改Position属性
你可以使用 set 函数来动态修改figure对象的 Position 属性:
fig = figure;
set(fig, 'Position', [200, 300, 600, 400]);
此方法适用于在运行过程中根据某些条件调整窗口尺寸或位置,例如根据用户屏幕分辨率自适应窗口大小。
5.2.2 使用get获取当前窗口位置与大小
有时我们需要根据当前窗口状态进行调整。例如,放大窗口尺寸:
fig = figure('Position', [100, 100, 500, 400]);
pos = get(fig, 'Position');
new_pos = pos + [0, 0, 100, 100]; % 宽度和高度各增加100像素
set(fig, 'Position', new_pos);
✅ 技巧:使用
get(fig, 'Units')可以获取当前使用的单位,确保坐标计算的一致性。
5.2.3 屏幕分辨率获取与自适应窗口设计
为了使图形窗口适配不同分辨率的屏幕,可以通过 get(0, 'ScreenSize') 获取屏幕尺寸:
screenSize = get(0, 'ScreenSize');
width = screenSize(3);
height = screenSize(4);
fig = figure('Position', [0, 0, width/2, height/2]);
上述代码创建了一个宽度和高度均为屏幕一半的图形窗口,并左上角位于屏幕原点(0,0)。
5.3 图形窗口在GUI界面中的嵌入与管理
在MATLAB的GUI开发中,figure窗口不仅用于展示图形,还经常需要嵌入到其他界面元素中,如面板(uipanel)或独立窗口中。
5.3.1 使用uipanel嵌入图形窗口
你可以将figure窗口嵌入到GUI界面的某个面板中,以实现更复杂的布局:
% 创建主GUI窗口
mainFig = figure('Position', [100, 100, 800, 600], 'MenuBar', 'none', 'ToolBar', 'none');
% 创建一个面板
panel = uipanel('Parent', mainFig, 'Title', '图形区域', ...
'Position', [0.1, 0.1, 0.8, 0.8]);
% 在面板中创建图形窗口
ax = axes('Parent', panel);
plot(ax, 1:10, rand(1,10), 'LineWidth', 2);
📌 说明:在GUI中使用
axes对象替代figure窗口进行绘图,可以更灵活地控制图形嵌入的位置和尺寸。
5.3.2 多图形窗口的切换与管理
在处理多个图形窗口时,可以使用 figure 命令切换窗口,或使用 findobj 查找特定窗口:
fig1 = figure;
plot(1:10, rand(1,10));
fig2 = figure;
plot(1:10, rand(1,10));
figure(fig1); % 切换到第一个图形窗口
title('图1');
figure(fig2); % 切换到第二个图形窗口
title('图2');
你也可以通过窗口标题查找figure对象:
fig = findobj('Type', 'figure', 'Name', 'Figure 1');
5.4 实践案例:灵活布局适应不同输出需求
在实际项目中,图形窗口的布局往往需要根据输出设备或展示形式进行定制。例如,生成一个横向宽图用于PPT展示,或者一个高分辨率竖图用于论文插图。
5.4.1 示例:创建一个适配PPT展示的横向图形窗口
以下脚本创建一个1600×900像素的宽图,适合用于幻灯片展示:
fig = figure('Position', [100, 100, 1600, 900], ...
'Name', 'PPT图表', ...
'NumberTitle', 'off');
% 绘制双坐标轴图
x = 1:10;
y1 = sin(x);
y2 = 100*cos(x);
[ax, h1, h2] = plotyy(x, y1, x, y2);
set(ax(1), 'YColor', 'r', 'YLim', [-1 1]);
set(ax(2), 'YColor', 'b', 'YLim', [-100 100]);
set(h1, 'LineStyle', '-', 'Color', 'r');
set(h2, 'LineStyle', '--', 'Color', 'b');
legend([h1, h2], {'sin(x)', 'cos(x)'});
📌 说明:该图形窗口宽度较大,适合展示趋势对比类图表,且标题不显示编号,符合PPT图表风格。
5.4.2 示例:创建一个用于论文插图的标准图形窗口
学术图表通常要求高分辨率、标准尺寸和边框设置:
% 设置单位为英寸,便于打印输出
fig = figure('Units', 'inches', 'Position', [0, 0, 6, 4], ...
'PaperUnits', 'inches', 'PaperPositionMode', 'auto');
% 绘图
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y, 'k-', 'LineWidth', 1.5);
xlabel('x');
ylabel('sin(x)');
title('正弦函数图像');
grid on;
% 导出为高分辨率TIF图像
print(fig, '-dtiff', '-r300', 'sine_plot');
📌 说明:此图形窗口使用英寸单位,尺寸为6×4英寸,分辨率为300dpi,符合学术出版标准。
5.5 进阶技巧:图形窗口布局的自动化脚本
对于需要批量生成图形的应用场景,我们可以编写自动化脚本,动态生成并调整多个图形窗口:
for i = 1:3
fig = figure('Position', [100*i, 100*i, 600, 400]);
plot(1:10, rand(1,10), 'LineWidth', 2);
title(['图表 #', num2str(i)]);
end
该脚本循环生成3个图形窗口,每个窗口依次偏移位置,便于同时观察多个图形。
5.6 总结与延伸
通过本章的学习,我们掌握了以下关键技能:
- 使用
figure对象和Position属性精确控制图形窗口的位置与大小; - 动态调整图形窗口以适应不同场景;
- 将图形窗口嵌入GUI界面并进行多窗口管理;
- 根据输出需求(如PPT、论文、GUI)灵活设置图形窗口布局;
- 编写脚本实现图形窗口的自动化生成与布局调整。
📌 延伸建议:结合
exportgraphics函数(适用于R2020a及以上版本)和
流程图:图形窗口控制流程
graph TD
A[创建figure对象] --> B[设置Position属性]
B --> C{是否动态调整?}
C -->|是| D[使用set命令修改属性]
C -->|否| E[直接定义窗口尺寸]
D --> F[获取屏幕尺寸]
E --> G[嵌入GUI界面]
F --> H[多窗口管理]
G --> I[使用axes对象绘图]
H --> J[使用findobj查找窗口]
J --> K[图形导出与展示]
本章内容为后续图形优化与输出打下了坚实基础,也为自动化图形处理流程提供了技术支持。在下一章中,我们将深入探讨如何从Excel中读取数据并自动生成图表,进一步拓展MATLAB在实际数据可视化项目中的应用能力。
6. 从Excel读取数据绘图流程
在数据分析和可视化过程中,从外部数据源导入数据是构建高质量图表的基础。MATLAB作为强大的科学计算与数据可视化平台,提供了多种从Excel文件中读取数据的方式。本章将系统地讲解如何通过MATLAB程序从Excel中读取数据,并将其用于图表的自动化绘制,特别是双坐标轴图的构建。我们将从数据导入方法开始,逐步深入到自动化流程、数据绑定与展示,并最终通过一个完整案例展示如何实现从Excel到双坐标轴图表的全流程自动化。
6.1 Excel数据导入MATLAB的方法
6.1.1 使用xlsread函数读取数据
MATLAB提供了一个内置函数 xlsread ,用于从Excel文件中读取数据。它支持.xls和.xlsx格式,并能读取指定工作表中的数据区域。
% 读取Excel文件中的数值数据
filename = 'data.xlsx';
sheet = 1;
xlRange = 'A1:D10'; % 指定读取范围
data = xlsread(filename, sheet, xlRange);
逐行解读:
-filename:指定Excel文件路径;
-sheet:指定读取的工作表编号或名称;
-xlRange:定义要读取的数据区域范围;
-xlsread返回一个双精度矩阵,适用于后续绘图操作。
注意: 如果Excel中包含文本或混合数据类型,建议使用 [num, txt, raw] = xlsread(...) 语法获取完整数据结构。
6.1.2 数据格式转换与预处理
导入的数据通常需要进行预处理以适应绘图需求。常见的预处理包括:
- 缺失值处理 :使用
isnan或rmmissing去除无效数据; - 数据排序与筛选 :对数据进行排序、分组;
- 单位转换与标准化 :将数据统一单位或进行归一化。
% 去除包含NaN的行
dataClean = data(~any(isnan(data), 2), :);
% 分离X轴和Y轴数据
x = dataClean(:, 1);
y1 = dataClean(:, 2);
y2 = dataClean(:, 3);
参数说明:
-isnan(data):判断数据中是否存在NaN;
-any(..., 2):按行判断是否存在NaN;
-~:逻辑非,保留不包含NaN的行。
6.2 数据绘图的自动化流程
6.2.1 自动识别数据列并生成图表
为了实现数据的自动化处理,可以编写脚本自动识别Excel中的列数,并根据列数生成相应的图表。例如,假设第一列为X轴,其余列为Y轴数据。
% 自动识别列数
numCols = size(dataClean, 2);
x = dataClean(:, 1); % 第一列为X轴
% 自动绘制所有Y列
figure;
hold on;
for i = 2:numCols
plot(x, dataClean(:, i), 'DisplayName', ['Y' num2str(i-1)]);
end
hold off;
legend show;
逻辑分析:
-size(dataClean, 2):获取列数;
-plot:循环绘制每一列;
-DisplayName:自动设置图例名称;
-legend show:显示图例。
6.2.2 动态更新图表内容
在某些场景下,我们需要根据数据变化动态更新图表内容。例如,当Excel文件更新后,重新加载并刷新图形。
% 定义图形句柄
fig = figure;
ax = axes;
% 定时器函数
timerObj = timer('ExecutionMode', 'fixedRate', ...
'Period', 10, ...
'TimerFcn', @(~,~) updatePlot(ax, filename));
start(timerObj);
% 定义更新函数
function updatePlot(ax, filename)
% 重新读取数据
data = xlsread(filename);
x = data(:, 1);
y = data(:, 2:end);
% 清除旧图并重绘
cla(ax);
hold(ax, 'on');
for i = 1:size(y, 2)
plot(ax, x, y(:, i), 'DisplayName', ['Y' num2str(i)]);
end
hold(ax, 'off');
legend(ax, 'show');
end
参数说明:
-timer:创建定时器对象;
-ExecutionMode:执行模式为固定频率;
-Period:每10秒更新一次;
-TimerFcn:定时器执行的回调函数。
6.3 双坐标轴图的数据绑定与展示
6.3.1 Excel数据与MATLAB图形的联动
在双坐标轴图中,不同数据集往往具有不同的量纲或单位。我们可以将Excel中不同列的数据分别绑定到左右Y轴上。
% 读取数据
data = xlsread('dual_axis_data.xlsx');
x = data(:, 1);
y1 = data(:, 2); % 左Y轴数据
y2 = data(:, 3); % 右Y轴数据
% 创建双坐标轴图
[ax, h1, h2] = plotyy(x, y1, x, y2, @plot, @plot);
% 设置图形属性
set(h1, 'Color', 'r', 'LineWidth', 2);
set(h2, 'Color', 'b', 'LineWidth', 2);
% 设置坐标轴标签
xlabel(ax(1), '时间 (s)');
ylabel(ax(1), '温度 (°C)', 'Color', 'r');
ylabel(ax(2), '压力 (kPa)', 'Color', 'b');
代码解读:
-plotyy:创建双坐标轴图;
-h1、h2:分别为左右轴的线条句柄;
-set:设置线条颜色与宽度;
-ylabel:为两个Y轴分别设置标签和颜色。
6.3.2 图形参数的动态配置
为了实现图形参数的动态配置,可以将配置信息(如颜色、线型、坐标轴范围)存储在Excel文件中,供MATLAB读取后动态设置。
| 参数名 | 值 |
|---|---|
| left_color | red |
| right_color | blue |
| left_range | [0 100] |
| right_range | [0 500] |
% 读取配置
config = readtable('config.xlsx');
leftColor = config.Value{1};
rightColor = config.Value{2};
% 创建双坐标轴图
[ax, h1, h2] = plotyy(x, y1, x, y2, @plot, @plot);
% 动态应用配置
set(h1, 'Color', leftColor, 'LineWidth', 2);
set(h2, 'Color', rightColor, 'LineWidth', 2);
% 设置坐标轴范围
ylim(ax(1), str2num(config.Value{3}));
ylim(ax(2), str2num(config.Value{4}));
逻辑分析:
- 使用readtable读取配置文件;
-str2num:将字符串转换为数值范围;
- 动态修改图形颜色与坐标轴范围。
6.4 实践案例:基于Excel数据的自动化双轴图生成
6.4.1 读取并解析多工作表数据
在实际应用中,Excel文件通常包含多个工作表,每个工作表对应不同类别的数据。我们可以通过脚本循环读取多个工作表并生成对应的双坐标轴图。
% 获取所有工作表名称
[sheets, ~] = xlsfinfo('multi_sheet_data.xlsx');
% 遍历每个工作表
for i = 1:length(sheets)
sheetName = sheets{i};
data = xlsread('multi_sheet_data.xlsx', sheetName);
x = data(:, 1);
y1 = data(:, 2);
y2 = data(:, 3);
% 创建图形
figure;
[ax, h1, h2] = plotyy(x, y1, x, y2, @plot, @plot);
% 设置图形属性
title(['Sheet: ' sheetName]);
xlabel(ax(1), '时间 (s)');
ylabel(ax(1), '温度 (°C)', 'Color', 'r');
ylabel(ax(2), '压力 (kPa)', 'Color', 'b');
% 导出图像
saveas(gcf, ['figure_' sheetName '.png']);
end
代码说明:
-xlsfinfo:获取Excel文件中所有工作表名;
-for循环:遍历每个工作表并绘制图表;
-saveas:将图表保存为PNG格式。
6.4.2 自动生成图表并导出为图像文件
为了实现图表的自动化生成与导出,可以将上述流程封装为函数,并结合定时任务或用户界面(如App Designer)进行调用。
% 封装函数
function generateDualAxisPlotsFromExcel(filename)
[sheets, ~] = xlsfinfo(filename);
for i = 1:length(sheets)
sheetName = sheets{i};
data = xlsread(filename, sheetName);
x = data(:, 1);
y1 = data(:, 2);
y2 = data(:, 3);
figure;
[ax, ~, ~] = plotyy(x, y1, x, y2, @plot, @plot);
title(['Sheet: ' sheetName]);
xlabel(ax(1), '时间 (s)');
ylabel(ax(1), '温度 (°C)', 'Color', 'r');
ylabel(ax(2), '压力 (kPa)', 'Color', 'b');
saveas(gcf, ['output_' sheetName '.png']);
close(gcf);
end
end
功能说明:
- 函数接受文件名作为输入;
- 遍历所有工作表并生成图表;
- 图表自动保存并关闭。
6.5 总结与延伸
在本章中,我们系统地讲解了从Excel中读取数据并使用MATLAB进行图表绘制的全过程,包括数据导入、预处理、自动化流程设计、双坐标轴图的构建与参数动态配置等内容。通过具体案例展示了如何实现多工作表数据的图表自动生成与导出,为构建数据驱动的自动化可视化系统提供了完整的技术路径。
未来可以进一步结合MATLAB App Designer开发交互式工具,或将图表集成到Web服务中,提升数据可视化与共享的效率与灵活性。
7. 图形属性定制与优化策略
7.1 图形属性的全面定制
在MATLAB中,图形的外观和行为都可以通过设置图形对象的属性来高度定制。MATLAB中所有的图形元素(如线条、坐标轴、图例等)都对应一个图形对象,每个对象都有自己的属性集。
7.1.1 颜色、线型与标记的个性化设置
我们可以使用 plot 函数或图形对象的句柄来设置线条的颜色、线型和标记样式。以下是一个基本的设置示例:
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
% 绘制两条曲线,并设置线型、颜色和标记
h1 = plot(x, y1, 'r--o', 'LineWidth', 1.5, 'MarkerFaceColor', 'g');
hold on;
h2 = plot(x, y2, 'b-s', 'LineWidth', 2, 'MarkerEdgeColor', 'k');
% 添加图例
legend([h1, h2], 'sin(x)', 'cos(x)');
参数说明:
-
'r--o':红色虚线,圆形标记 -
'LineWidth':线条宽度 -
'MarkerFaceColor':标记填充颜色 -
'MarkerEdgeColor':标记边缘颜色
通过这些设置,我们可以精确控制图形的外观,使其更符合展示需求。
7.1.2 图形对象的句柄操作与属性调整
MATLAB中所有图形对象都可以通过句柄进行访问和修改。例如:
% 获取当前坐标轴句柄
ax = gca;
% 设置坐标轴标题
title(ax, '正弦与余弦曲线');
% 设置坐标轴标签
xlabel(ax, '角度 (弧度)');
ylabel(ax, '幅值');
% 设置坐标轴范围
xlim(ax, [0 2*pi]);
ylim(ax, [-1.5 1.5]);
% 设置网格可见性
grid(ax, 'on');
通过句柄操作,我们可以更灵活地控制图形的每个细节。
7.2 图形性能优化技巧
在处理大量数据或复杂图形时,图形性能可能会下降。以下是一些优化策略:
7.2.1 减少图形渲染负担
- 限制数据点数量 :使用
downsample函数或数据采样方法减少绘图数据量。 - 关闭不必要的图形元素 :如网格、图例、背景色等。
- 使用
drawnow limitrate:在循环绘图中使用该命令可以减少绘图频率,提升效率。
for i = 1:1000
y = sin(x + i/10);
plot(x, y);
drawnow limitrate; % 降低刷新频率
end
7.2.2 提高图形响应速度
- 使用
Handle Graphics 2系统 :确保使用的是MATLAB R2014b之后的图形系统。 - 避免在循环中频繁创建图形对象 :使用
set函数更新已有对象属性。 - 启用
Opengl渲染器 :提高图形渲染速度。
set(gcf, 'Renderer', 'opengl');
7.3 图形输出与导出的最佳实践
7.3.1 高分辨率图像的导出设置
在撰写论文或报告时,图形的分辨率至关重要。推荐使用 print 命令导出为矢量图或高分辨率位图:
% 导出为300dpi的PNG图像
print('output_figure', '-dpng', '-r300');
% 导出为PDF矢量图
print('output_figure', '-dpdf');
7.3.2 图形格式的选择与适配
| 图形格式 | 适用场景 | 特点 |
|---|---|---|
| PNG | 网页展示、演示文稿 | 位图,支持透明背景 |
| 学术论文、出版物 | 矢量图,可缩放无损 | |
| EPS | 旧版论文系统 | 矢量图,兼容性好 |
| JPEG | 图像压缩 | 有损压缩,适合照片 |
7.4 实践案例:高质量图表在报告和演示中的应用
7.4.1 图形定制满足出版要求
在撰写学术论文时,图形必须满足期刊的格式规范。以下是一个完整的定制流程示例:
% 创建图形
figure;
x = linspace(0, 2*pi, 1000);
y1 = sin(x);
y2 = cos(x);
% 绘图
h1 = plot(x, y1, 'Color', [0.2 0.4 0.6], 'LineStyle', '-', 'LineWidth', 1.5);
hold on;
h2 = plot(x, y2, 'Color', [0.8 0.3 0.1], 'LineStyle', '--', 'LineWidth', 1.5);
% 设置坐标轴
ax = gca;
ax.FontName = 'Times New Roman';
ax.FontSize = 12;
xlabel(ax, '角度 (弧度)', 'FontName', 'Times New Roman', 'FontSize', 12);
ylabel(ax, '幅值', 'FontName', 'Times New Roman', 'FontSize', 12);
title(ax, '正弦与余弦曲线', 'FontName', 'Times New Roman', 'FontSize', 14);
% 图例
lgd = legend([h1, h2], 'sin(x)', 'cos(x)');
lgd.FontName = 'Times New Roman';
lgd.FontSize = 12;
% 设置边框加粗
set(ax, 'Box', 'on', 'LineWidth', 1.2);
% 导出为PDF
print('publication_plot', '-dpdf');
7.4.2 图表在PPT和文档中的高效集成
将图表导出为矢量格式(如PDF或EMF)后,可以直接插入到Word或PPT中,保持高质量且易于缩放。在PPT中插入PDF图形时,建议使用“插入 → 图片 → 选择PDF文件”,并启用“保留矢量格式”。
此外,可使用MATLAB的 exportgraphics 函数(R2020a及以上)进行更现代的导出控制:
exportgraphics(gcf, 'figure.emf', 'ContentType', 'vector');
此命令导出的 .emf 文件在PPT中缩放无失真,非常适合用于演示文稿和报告。
(本章节内容未总结性语句)
简介:在MATLAB 2018中,绘制双坐标图是数据可视化中的常见需求,尤其适用于展示不同量纲或量级的数据对比。本教程通过实际脚本“huatu20200105.m”,讲解如何创建双坐标轴、设置透明图例、加粗图框、调整图形大小与位置等关键操作。结合Excel数据源“040.xlsx”,帮助用户掌握完整的图形定制流程,提升图表的专业性与视觉表现力。适合希望提升MATLAB数据可视化能力的IT从业者和学习者。

590

被折叠的 条评论
为什么被折叠?



