好的,咱们这就来聊聊 MATLAB 里怎么给曲线“点上记号”,也就是标点,让咱们的图看得更清楚。这事儿说起来不复杂,但细节弄好了,效果绝对是不一样的。
想象一下,你辛辛苦苦算出来一堆数据,然后用 MATLAB 画出了条漂亮的曲线。这时候,如果你想在图上特别指出某几个点,比如最高点、最低点,或者你认为特别有意义的几个数据点,那标点就派上用场了。它能让看图的人一眼就明白你想强调什么。
MATLAB 标点,基本思路是啥?
说白了,标点就是咱们在曲线上“画”上一些小符号。MATLAB 提供了很多种方法来实现这一点,最常用的就是结合 `plot` 函数本身的一些参数,以及 `hold on` 配合 `plot` 或者 `scatter` 函数。
方法一:在 `plot` 函数里直接指定标记
这是最简单直接的方法,适用于你想在绘制曲线的同时就给所有数据点都加上标记,或者只给一部分点加上不同标记。
假设我们有一组数据 `x` 和 `y`,想在绘制的曲线上用圆圈('o')作为标记。
```matlab
% 假设我们有一些数据
x = 0:0.5:10;
y = sin(x);
% 绘制曲线,并在每个数据点上加上圆圈标记
plot(x, y, 'o'); % '' 表示连接线,'o' 表示圆圈标记
```
这里 `'o'` 是一个格式字符串。MATLAB 的 `plot` 函数很强大,你可以组合各种字符来控制线条的样式和标记的样式。
线条样式:
``:实线 (默认)
``:虚线
`:`:点线
`.`:点划线
标记样式:
`o`:圆圈
`x`:叉号
`+`:加号
``:星号
`.`:实心点
`s`:方形
`d`:菱形
`^`:向上三角形
`v`:向下三角形
`>`:向右三角形
`<`:向左三角形
`p`:五角星
`h`:六角星
你可以单独使用标记,比如 `plot(x, y, 'o')`,这样只会显示标记,没有连接线。
举个例子,如果我们想让曲线是实线,但在一些特殊点上用星号标记?
这就要用到 `hold on` 了。
方法二:`hold on` 配合再次 `plot` 标记特定点
`hold on` 是 MATLAB 绘图中一个非常重要的概念。它允许你在当前的坐标系中叠加绘制新的图形,而不会清除掉之前绘制的任何东西。
假设我们有一条曲线,然后我们想在曲线上的几个特定位置加上一个特殊的标记(比如星号),并且这个标记的颜色和大小我们想自己控制。
```matlab
% 原始数据
x_orig = 0:0.2:10;
y_orig = sin(x_orig) + 0.1randn(size(x_orig)); % 加一点随机噪声
% 绘制原始曲线
figure; % 创建一个新的图形窗口
plot(x_orig, y_orig, 'b'); % 绘制蓝色实线
hold on; % 开启叠加模式
% 假设我们想标记 x=3, x=6, x=9 这几个点
x_points_to_mark = [3, 6, 9];
% 找到这些 x 值在原始 x_orig 中的索引,然后获取对应的 y 值
% 这里我们直接查找 x_orig 中最接近的值,或者更严谨一点可以用 find
% 为了简单起见,这里假设 x_orig 包含这几个值
idx_3 = find(x_orig == 3);
idx_6 = find(x_orig == 6);
idx_9 = find(x_orig == 9);
y_points_to_mark = [y_orig(idx_3), y_orig(idx_6), y_orig(idx_9)];
% 绘制标记点
% '' 表示带星号标记的线条,但是我们只想显示标记,所以不加 ''
% 我们可以指定标记颜色、大小和样式
plot(x_points_to_mark, y_points_to_mark, ''); % 默认样式
% 想要更精细的控制:
% plot(x_points_to_mark, y_points_to_mark, 'ks', 'MarkerSize', 10, 'MarkerFaceColor', 'y');
% 'k' 黑色, 's' 方形, MarkerSize 标记大小, MarkerFaceColor 标记填充颜色
hold off; % 关闭叠加模式,否则之后绘制的东西也会叠加进来
% 添加一些说明
title('带有标记点的曲线');
xlabel('X 轴');
ylabel('Y 轴');
legend('原始数据', '标记点');
grid on;
```
在 `plot(x_points_to_mark, y_points_to_mark, '')` 这一行,我们可以进一步控制标记的属性:
标记颜色: 可以用字符串 `'r'`, `'g'`, `'b'`, `'k'`, `'m'`, `'c'`, `'y'`, `'w'` 或者 RGB 三元组 `[R G B]`。
标记大小: 使用 `'MarkerSize'` 参数,例如 `MarkerSize', 12`。
标记面颜色 (如果标记有填充的话): 使用 `'MarkerFaceColor'` 参数,例如 `MarkerFaceColor', 'g'`。
方法三:使用 `scatter` 函数
`scatter` 函数专门用于绘制散点图,但它也提供了一种非常灵活的方式来绘制带有标记的点,而且可以为每个点设置不同的颜色、大小甚至标记样式。
如果你的主要目的是在曲线上放置孤立的、需要精细控制的标记点,`scatter` 会比 `plot` 更有优势。
```matlab
% 原始数据
x_orig = 0:0.2:10;
y_orig = sin(x_orig) + 0.1randn(size(x_orig));
% 绘制原始曲线
figure;
plot(x_orig, y_orig, 'b');
hold on;
% 想要标记的点
x_scatter = [3, 6, 9];
y_scatter = [y_orig(find(x_orig == 3)), y_orig(find(x_orig == 6)), y_orig(find(x_orig == 9))];
% 使用 scatter 绘制标记点
% 第一个参数是 x 坐标,第二个是 y 坐标
% 'filled' 填充标记
% 'MarkerFaceColor' 标记填充颜色
% 'MarkerEdgeColor' 标记边框颜色
% 'SizeData' 标记大小
scatter(x_scatter, y_scatter, 150, 'r', 'filled'); % 红色实心圆,大小150
% 也可以为每个点设置不同的属性,这就更强大了
% 比如,你想让前一个点是蓝色方形,后两个点是绿色星形
x_multi = [2, 5, 8];
y_multi = [y_orig(find(x_orig == 2)), y_orig(find(x_orig == 5)), y_orig(find(x_orig == 8))];
colors = {'b', 'g', 'g'}; % 颜色
sizes = [100, 200, 200]; % 大小
markers = {'s', '', ''}; % 标记样式 (scatter 也可以直接指定标记样式,但通常是 scatterplot 的一种用法,对基础 scatter 来说, Marker 属性不直接用于改变标记样式,而是通过 MarkerFaceColor 这种更通用的方式)
% 注意:scatter 的直接用法主要集中在颜色和大小上,如果需要不同标记样式,通常需要多次调用 scatter 或者结合 plot。
% 在基础 scatter 中, Marker 属性不是直接像 plot 那样指定字符串,而是通过 MarkerStyle 这种概念。
% 我们可以这样实现不同的标记:
scatter(x_multi(1), y_multi(1), 100, 'b', 'filled', 'Marker', 's'); % 蓝色实心方形
scatter(x_multi(2:3), y_multi(2:3), 200, 'g', 'filled', 'Marker', ''); % 绿色实心星形
hold off;
title('使用 scatter 标记的曲线');
xlabel('X 轴');
ylabel('Y 轴');
legend('原始数据', '关键点 1', '关键点 2 & 3');
grid on;
```
`scatter` 函数的参数非常灵活:
`X`, `Y`: 点的坐标。
`S`: 点的大小。可以是一个标量,表示所有点大小相同;也可以是一个向量,表示每个点的大小不同。
`C`: 点的颜色。可以是一个颜色字符串(如 `'r'`, `'b'`),一个 RGB 三元组,或者一个颜色映射向量,用于根据数值映射颜色。
`'filled'`: 这个是属性值对,表示填充标记。
`'Marker'`: 这个属性通常用于 `scatter` 的一些高级用法,或者在一些特定版本的 MATLAB 中。但在基础的 `scatter` 中,如果你想改变标记的形状,最直接的方法是多次调用 `scatter`,每次指定不同的 `Marker` 属性(这是通过 `scatter` 函数本身支持的属性实现的,而不是像 `plot` 那样直接写在字符串里)。
小提示: 如果你确实需要为不同的点设置不同的标记形状(比如有的点是圆圈,有的点是星号),并且不想用 `plot` 配合 `hold on` 的方式,你可以直接多次调用 `scatter` 函数,每次指定一个或一组点的坐标,以及它们要用的标记样式和颜色。
方法四:添加文本标签 `text` 和 `annotation`
有时候,你不仅仅想标出点,还想给这个点加上一些说明文字。这时就可以用到 `text` 函数或者 `annotation` 函数。
```matlab
% 原始数据
x_orig = 0:0.2:10;
y_orig = sin(x_orig) + 0.1randn(size(x_orig));
% 绘制原始曲线
figure;
plot(x_orig, y_orig, 'b');
hold on;
% 找到最大值和最小值点
[max_y, max_idx] = max(y_orig);
max_x = x_orig(max_idx);
[min_y, min_idx] = min(y_orig);
min_x = x_orig(min_idx);
% 标记最大值点,并添加文本标签
plot(max_x, max_y, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r'); % 红色实心圆
text(max_x, max_y, sprintf(' Max: %.2f', max_y), 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'left'); % 加一点偏移,方便阅读
% 标记最小值点,并添加文本标签
plot(min_x, min_y, 'gs', 'MarkerSize', 10, 'MarkerFaceColor', 'g'); % 绿色实心方形
text(min_x, min_y, sprintf(' Min: %.2f', min_y), 'VerticalAlignment', 'top', 'HorizontalAlignment', 'left');
hold off;
title('带有最大最小值标记和标签的曲线');
xlabel('X 轴');
ylabel('Y 轴');
legend('原始数据', '最大值', '最小值');
grid on;
```
`text(x, y, '字符串')`: 在指定的 `(x, y)` 坐标处添加文本。你可以用 `'VerticalAlignment'` (例如 `'top'`, `'bottom'`, `'middle'`) 和 `'HorizontalAlignment'` (例如 `'left'`, `'right'`, `'center'`) 来控制文本相对于 `(x, y)` 点的位置。
`annotation('textarrow', x_coord, y_coord, 'String', '你的文本')`: `annotation` 函数更灵活,尤其擅长绘制带有箭头的文本。`x_coord` 和 `y_coord` 的单位是归一化坐标(0到1),表示相对于图形窗口的百分比。这使得你可以在图的任何位置添加说明,即使这个位置不在数据范围内。
总结一下
1. 直接 `plot`: `plot(x, y, '格式字符串')`。适合给所有点统一加标记,或者在同一个 `plot` 调用中混合线型和标记。
2. `hold on` + `plot`: `plot(x, y, '线型')` 然后 `hold on; plot(x_mark, y_mark, '标记属性')`。非常适合在已有的图上叠加特定点,并且可以精细控制标记的颜色、大小等。
3. `scatter`: `scatter(x, y, size, color, 'filled', 'Marker', '标记样式')`。专为标记点设计,颜色、大小控制极其灵活,而且可以为不同点设置不同属性。
4. `text` / `annotation`: 在标记点旁边添加说明文字,解释这个点代表什么。
要做出漂亮的图,不仅仅是数据准确,更重要的是能清晰地传达信息。掌握了这些标点的方法,你的 MATLAB 图就会更上一层楼!多尝试,多看看 MATLAB 的帮助文档,你会发现更多有意思的用法。