在MATLAB中进行数据可视化是日常任务之一,绘制各种曲线图、散点图、柱状图等是基础操作。然而,当你在同一个坐标系中绘制多条不同含义的曲线或不同类型的数据点时,如何区分它们就成了一个关键问题。这时,图例(Legend)就派上了用场。
什么是MATLAB图例?为什么需要它?
什么是图例?
MATLAB中的图例是一个小框,通常位于图形的一角或其他合适位置,它包含了图形中每个数据系列(如每条曲线、每组散点等)的代表性图标(如线条样式、颜色、标记点)及其对应的文字说明。这些文字说明通常是用户定义的,用于解释该数据系列代表的物理量、实验条件或分类等。
为什么需要图例?
添加图例的主要目的是为了提高图形的可读性和信息传达效率。在一个复杂的图形中,如果没有图例,观众将无法区分不同的曲线或数据点代表的是什么。图例提供了一个清晰的键,将图形元素与它们的含义关联起来,使得观众无需猜测即可理解图形所呈现的数据关系和模式。
简而言之,图例解答了观众心中的疑问:“这根蓝色的线是什么意思?那个红色的圆点代表什么?”
如何在MATLAB中添加图例?(核心操作)
在MATLAB中添加图例非常简单,主要通过legend函数来实现。这个函数有多种用法,可以根据你的需要灵活选择。
基本用法:绘制后直接添加
最常见的用法是在绘制完所有需要添加图例的图形对象(如线条、散点)之后,直接调用legend函数,并按绘制的顺序提供图例的文字说明。
x = 0:pi/10:2*pi; y1 = sin(x); y2 = cos(x);
plot(x, y1); % 第一条曲线 hold on; % 保持当前坐标系,以便绘制下一条曲线 plot(x, y2); % 第二条曲线 hold off;
% 在绘制完成后添加图例 % 注意:文字顺序与绘制顺序对应 legend('sin(x)', 'cos(x)');
在这个例子中,’sin(x)’会对应第一条绘制的曲线(蓝色),’cos(x)’会对应第二条绘制的曲线(橙色)。
更灵活的用法:使用DisplayName属性
在调用绘图函数(如plot, scatter, bar等)时,可以直接使用'DisplayName'属性来指定该图形对象在图例中显示的文本。这种方法的好处是,即使你改变了绘图顺序,或者后续删除了某个图形对象,图例也会自动更新并保持正确对应关系。
x = 0:pi/10:2*pi;
plot(x, sin(x), 'DisplayName', '正弦曲线'); % 绘制时指定DisplayName hold on; plot(x, cos(x), 'DisplayName', '余弦曲线'); % 绘制时指定DisplayName hold off;
% 调用legend函数,无需提供文本参数 legend();
或者,你也可以在调用legend时,显式地只包含你想在图例中显示的对象的DisplayName:
x = 0:pi/10:2*pi;
h1 = plot(x, sin(x), 'DisplayName', '正弦曲线'); hold on; h2 = plot(x, cos(x), 'DisplayName', '余弦曲线'); h3 = plot(x, sin(2*x), '--k'); % 这条线没有DisplayName hold off;
% 只为h1和h2添加图例 legend([h1, h2]);
这种方式非常推荐,特别是当图形对象较多或需要动态管理图例时。
为特定图形对象添加图例
如果你只想为图形中的一部分对象添加图例,可以通过获取这些对象的句柄,并将句柄作为第一个参数传递给legend函数。
x = 1:10;
h_scatter = scatter(x, x.^2, 'filled', 'DisplayName', '平方'); % 散点图 hold on; h_plot = plot(x, x.^3, '-r', 'LineWidth', 1.5); % 曲线图,注意没有DisplayName hold off;
% 只为散点图添加图例 legend(h_scatter); % 使用scatter绘制时指定的DisplayName
或者,如果你没有使用DisplayName属性:
h_scatter = scatter(x, x.^2, 'filled'); % 散点图 hold on; h_plot = plot(x, x.^3, '-r', 'LineWidth', 1.5); % 曲线图 hold off;
% 只为散点图添加图例,并指定文本 legend(h_scatter, '平方值');
图例的位置与布局(“哪里”和“如何控制”)
图例的位置对图形的美观和信息传达非常重要。一个不恰当的图例位置可能会遮挡住关键的数据区域。MATLAB提供了多种控制图例位置的方法。
自动选择最佳位置
默认情况下,如果你不指定位置,MATLAB会尝试寻找一个对数据遮挡最小的“最佳”位置。
legend('数据1', '数据2'); % MATLAB自动选择位置
你也可以显式地请求最佳位置:
legend('数据1', '数据2', 'Location', 'best');
使用预设位置字符串
MATLAB定义了许多常用的位置字符串,可以直接使用:
'north','south','east','west':上、下、左、右居中'northeast'(右上角,默认),'northwest'(左上角),'southeast'(右下角),'southwest'(左下角)'northoutside','southoutside','eastoutside','westoutside':放置在坐标区外部的对应方向'bestoutside':在外部寻找最佳位置
legend('曲线A', '曲线B', 'Location', 'northwest'); % 将图例放置在左上角
legend('结果1', '结果2', '结果3', 'Location', 'southoutside'); % 放置在图形下方
将图例放置在坐标区外部(使用带有’outside’的选项)是一个避免遮挡数据的好方法,但这会使图形整体变小,因为需要为图例腾出空间。
精确控制位置和大小
对于更精确的控制,你可以获取图例对象的句柄,然后修改其'Position'属性。'Position'属性接受一个四元素的向量 [left bottom width height],这些值是相对于坐标区或图形窗口的归一化坐标(通常是相对于坐标区内部,除非图例在外部)。归一化坐标范围通常是0到1。
h_leg = legend('项1', '项2'); % 获取图例句柄 set(h_leg, 'Position', [0.7 0.1 0.2 0.15]); % 将图例放在坐标区右下角附近,并指定大小
这里的 [0.7 0.1 0.2 0.15] 表示:左边界位于坐标区宽度的70%处,底边界位于坐标区高度的10%处,图例宽度占坐标区宽度的20%,高度占坐标区高度的15%。
控制图例列数
当图例项很多时,图例框可能会变得很长。你可以使用'NumColumns'属性来指定图例分几列显示,从而节省垂直空间。
legend('数据A', '数据B', '数据C', '数据D', 'Location', 'southoutside', 'NumColumns', 2); % 分成两列
图例的样式与自定义(“能自定义吗?”/“多少属性可以改?”)
MATLAB的图例对象有很多可定制的属性,可以让你修改图例的外观,使其更符合你的出版或报告要求。你可以通过获取图例句柄,然后使用set函数来修改这些属性。
h_leg = legend('曲线1', '曲线2'); % 获取图例句柄
现在可以使用set(h_leg, 'PropertyName', PropertyValue)来修改属性。
修改字体、大小、颜色
- 字体大小 (FontSize):
set(h_leg, 'FontSize', 10); - 字体粗细 (FontWeight):
set(h_leg, 'FontWeight', 'bold');(‘normal’ 或 ‘bold’) - 字体样式 (FontAngle):
set(h_leg, 'FontAngle', 'italic');(‘normal’ 或 ‘italic’) - 字体名称 (FontName):
set(h_leg, 'FontName', 'Arial'); - 文本颜色 (TextColor):
set(h_leg, 'TextColor', 'blue');或set(h_leg, 'TextColor', [0 0.5 0]);(RGB 三元组)
控制边框和背景
- 边框可见性 (Box):
set(h_leg, 'Box', 'off');(‘on’ 或 ‘off’) - 背景颜色 (Color):
set(h_leg, 'Color', 'white');或set(h_leg, 'Color', [0.9 0.9 0.9]);(RGB 三元组) - 边框颜色 (EdgeColor):
set(h_leg, 'EdgeColor', 'red');
调整图标大小和间距
- 图标大小 (ItemTokenSize): 控制图例中线条或标记的大小,接受一个两元素的向量
[宽度 高度](以点为单位)。set(h_leg, 'ItemTokenSize', [30 5]); % 将图标宽度设为30点,高度设为5点(对线条有效)
注意:这个属性对不同类型的图例项(线条、标记、补丁等)效果可能略有不同。
还有许多其他属性可以调整,例如图例内部的填充(Padding)、文本与图标之间的间距等,可以通过查看图例对象的完整属性列表来探索 (get(h_leg) 命令)。
管理图例:添加、删除与交互(“如何操作”的更多细节)
事后添加或修改图例项
如果你在绘制完所有内容并添加图例后,又添加了新的图形对象,并希望将其加入现有图例,或者想修改现有图例项的文本,该怎么办?
- 如果使用了
DisplayName属性:只需要为新的图形对象设置DisplayName,然后再次调用不带参数的legend()函数,或者使用legend('refresh')。如果修改了现有对象的DisplayName,图例也会自动更新。 - 如果未大量使用
DisplayName:获取图例句柄,然后修改其'String'属性。'String'属性是一个单元数组,包含所有图例文本。你需要手动构建新的单元数组并赋值。这种方法相对繁琐且容易出错,特别是当图形对象顺序或数量改变时。因此,强烈推荐使用DisplayName属性。
删除图例
删除图例有两种简单的方法:
- 调用
legend('off'):这会关闭当前坐标系上的图例。 - 获取图例句柄并删除对象:
h_leg = legend(...); delete(h_leg);
图例的交互性
MATLAB R2014b及更高版本中,图例默认是交互式的。点击图例中的一个条目,可以切换对应图形对象(如线条)的可见性。这是一个非常方便的功能,可以在探索数据时临时隐藏或显示某些数据系列。如果需要禁用这种交互性,可以在调用legend时设置'Interpreter'属性为'none',但这也会影响文本的解释方式,通常不建议为此禁用交互性。
常见问题与提示
- 图例不显示或不完整: 确保你调用了
legend函数。如果你使用了DisplayName,确保绘图时正确设置了该属性。如果你直接传递文本,确保文本的数量和顺序与你希望显示在图例中的图形对象数量和绘制顺序相符。 - 图例顺序错误: 如果没有使用
DisplayName,图例文本的顺序严格按照调用plot或其他绘图函数的顺序。如果使用了DisplayName,并调用legend(),顺序通常按照对象在Axes的Children列表中的顺序,这通常也反映了绘制顺序。如果使用legend(handles, strings),则顺序由handles数组决定。 - 图例遮挡图形: 尝试使用不同的
'Location'选项,特别是带有'outside'的选项。或者获取图例句柄,使用'Position'属性手动调整其位置。 - 在子图(Subplot)中添加图例: 当使用
subplot时,确保在调用legend函数之前,目标子图对应的坐标区是当前活动的(即最近一次调用subplot或axes(h_axes)指定的)。 - 图例文本包含特殊字符或公式: MATLAB图例文本默认支持TeX或LaTeX解释器,可以用来显示希腊字母、上下标或数学公式。例如:
legend('y = sin(\omega t)', 'Interpreter', 'tex')或legend('$y = \cos(2\pi f t)$', 'Interpreter', 'latex')。如果文本是纯字符串,不想被解释,设置'Interpreter', 'none'。
掌握在MATLAB中添加和定制图例是创建专业、易于理解的图形的重要一步。通过灵活运用
legend函数及其各种属性,你可以有效地向观众传达图形中不同数据系列所代表的信息,极大地提升你的数据可视化效果。