MATLAB二维曲线图绘制:从基础plot到高级自定义
1. MATLAB二维曲线图绘制基础
第一次接触MATLAB绘图时,我被plot函数的简洁震撼到了。只需两行代码,就能把枯燥的数据变成直观的图形。让我们从一个经典的正弦函数开始:
x = linspace(0, 2*pi, 100); % 生成0到2π的100个等距点 y = sin(x); % 计算每个点的正弦值 plot(x, y) % 绘制曲线这个简单的例子揭示了MATLAB绘图的核心逻辑:先准备x轴数据,再计算对应的y值,最后用plot连线。linspace函数特别实用,它能自动生成指定区间内的等距点,第三个参数控制点的密度,数值越大曲线越平滑。
新手常犯的错误是忘记加分号,导致命令行窗口输出大量数据。另一个常见问题是图形窗口被覆盖,这时需要用figure命令新建窗口:
figure % 创建新图形窗口 plot(x, y)2. 多曲线绘制与图形修饰
实际工作中,我们经常需要比较多组数据。MATLAB提供了两种绘制多曲线的方法:
2.1 单窗口多曲线绘制
使用hold命令可以保留当前图形,继续添加新曲线:
plot(x, sin(x), 'r') % 红色正弦曲线 hold on plot(x, cos(x), 'b--') % 蓝色虚线余弦曲线 hold off提示:hold on相当于"冻结"当前图形状态,之后的绘图都会叠加显示。完成叠加后务必用hold off解除,否则后续单独绘图会出错。
2.2 多子图绘制
subplot函数能将窗口划分为多个区域,每个区域独立绘图:
subplot(2,1,1) % 2行1列的第1个子图 plot(x, sin(x)) subplot(2,1,2) % 第2个子图 plot(x, cos(x))更现代的tiledlayout布局(R2019b引入)提供了更灵活的排版:
t = tiledlayout(2,2); % 2x2布局 nexttile % 激活第1个区域 plot(x, sin(x)) nexttile % 激活第2个区域 plot(x, cos(x))3. 线条样式深度定制
MATLAB提供了丰富的线条定制选项,通过字符串参数即可快速设置:
plot(x, y, '--or') % 红色虚线带圆圈标记这个神奇的字符串由三部分组成:
--表示虚线样式o表示圆形标记r表示红色
3.1 线型对照表
| 符号 | 线型 | 示例效果 |
|---|---|---|
- | 实线(默认) | ━━━━━━━━━━━━ |
-- | 虚线 | ━ ━ ━ ━ ━ ━ |
: | 点线 | · · · · · · · |
-. | 点划线 | ━·━·━·━·━ |
3.2 标记符号大全
| 符号 | 说明 | 符号 | 说明 |
|---|---|---|---|
o | 圆圈 | square | 方形 |
+ | 加号 | diamond | 菱形 |
* | 星号 | ^ | 上三角 |
. | 点 | v | 下三角 |
x | 叉号 | pentagram | 五角星 |
3.3 颜色代码表
| 颜色名 | 简写 | RGB值 | 十六进制 |
|---|---|---|---|
| 红色 | r | [1 0 0] | #FF0000 |
| 绿色 | g | [0 1 0] | #00FF00 |
| 蓝色 | b | [0 0 1] | #0000FF |
| 青色 | c | [0 1 1] | #00FFFF |
| 洋红 | m | [1 0 1] | #FF00FF |
| 黄色 | y | [1 1 0] | #FFFF00 |
4. 高级属性编程控制
当需要更精细控制时,可以直接操作Line对象的属性。先获取Line对象句柄:
ln = plot(x, y); % 获取线条对象然后就能像操作普通对象一样修改属性:
ln.LineWidth = 2; % 线宽2磅 ln.Color = [0.2 0.6 0.4]; % 自定义RGB颜色 ln.Marker = 'pentagram'; % 五角星标记 ln.MarkerSize = 10; % 标记大小 ln.MarkerFaceColor = 'yellow'; % 标记填充色4.1 常用属性详解
- LineStyle:控制线型,等同字符串参数中的线型部分
- LineWidth:线宽(默认0.5磅)
- Color:线条颜色(RGB数组或颜色名)
- Marker:数据点标记符号
- MarkerSize:标记尺寸(默认6磅)
- MarkerEdgeColor:标记边框颜色
- MarkerFaceColor:标记填充颜色
4.2 标记显示优化技巧
当数据点密集时,标记会重叠影响美观。可以通过MarkerIndices属性间隔显示:
plot(x, y, '-o', 'MarkerIndices', 1:10:length(y)) % 每10个点显示一个标记5. 专业图表元素添加
完整的科研图表还需要以下元素:
5.1 坐标轴与标题
xlabel('时间(s)') % x轴标签 ylabel('电压(V)') % y轴标签 title('实验数据曲线') % 图表标题 grid on % 显示网格线5.2 图例与注释
legend('测量值', '理论值', 'Location', 'northwest') % 添加图例 text(pi, 0, '零点', 'FontSize', 12) % 在(π,0)处添加文字注释 annotation('arrow', [0.2 0.3], [0.8 0.7]) % 添加箭头标注5.3 坐标轴范围调整
axis([0 2*pi -1.5 1.5]) % 设置x/y轴范围 set(gca, 'XTick', 0:pi/2:2*pi) % 设置x轴刻度 set(gca, 'XTickLabel', {'0','π/2','π','3π/2','2π'}) % 刻度标签6. 实战案例:温度数据分析
假设我们有一组某城市全年的温度数据:
months = 1:12; avgTemp = [3, 5, 9, 15, 20, 25, 28, 27, 23, 17, 10, 5]; maxTemp = avgTemp + 5; minTemp = avgTemp - 5; figure('Position', [100 100 800 400]) % 设置图形大小 plot(months, avgTemp, 'b-o', 'LineWidth', 2, 'MarkerFaceColor', 'b') hold on plot(months, maxTemp, 'r--s', 'LineWidth', 1.5) plot(months, minTemp, 'g-.d', 'LineWidth', 1.5) hold off xlabel('月份') ylabel('温度(℃)') title('某城市月均温度变化趋势') set(gca, 'XTick', 1:12, 'XTickLabel', {'1月','2月','3月','4月','5月','6月',... '7月','8月','9月','10月','11月','12月'}) legend('平均温度', '最高温度', '最低温度', 'Location', 'best') grid on这段代码展示了如何将前面学到的所有技巧综合运用,制作出可直接用于科研论文的专业图表。关键点包括:
- 使用figure设置图形窗口大小
- 三条曲线采用不同线型和标记
- 自定义x轴刻度标签
- 添加网格线和图例
- 标记填充色增强视觉效果
7. 性能优化与常见问题
处理大数据量时(如超过1万个数据点),绘图可能变慢。这时可以:
- 减少数据点密度
- 关闭标记显示
- 使用drawnow限制刷新频率
x = linspace(0, 10, 10000); % 1万个数据点 y = sin(x); % 优化前(慢) plot(x, y, '-o') % 优化后(快) plot(x(1:10:end), y(1:10:end), '-') % 降采样常见问题解决方案:
- 图形不显示:检查是否误用了分号抑制了图形输出
- 中文显示乱码:设置字体
set(gca,'FontName','Microsoft YaHei') - 保存分辨率低:使用exportgraphics函数
exportgraphics(gcf,'plot.png','Resolution',300)
在长期使用MATLAB绘图的过程中,我逐渐养成了保存绘图模板的习惯。把常用的样式配置写成函数,可以大幅提升工作效率。比如下面这个标准化科研图表的模板函数:
function h = createSciencePlot(x, y, options) arguments x (1,:) double y (:, :) double options.LineStyle = '-' options.Marker = 'none' options.Color = [0 0.447 0.741] options.LineWidth = 1.5 options.MarkerSize = 8 options.XLabel = '' options.YLabel = '' options.Title = '' options.Legend = {} end h = figure('Color', 'w', 'Position', [100 100 600 400]); ax = axes('Parent', h, 'FontSize', 12, 'LineWidth', 1.2); hold(ax, 'on') for i = 1:size(y,1) plot(ax, x, y(i,:), ... 'LineStyle', options.LineStyle, ... 'Marker', options.Marker, ... 'Color', options.Color(i,:), ... 'LineWidth', options.LineWidth, ... 'MarkerSize', options.MarkerSize); end xlabel(ax, options.XLabel, 'FontSize', 14) ylabel(ax, options.YLabel, 'FontSize', 14) title(ax, options.Title, 'FontSize', 16) if ~isempty(options.Legend) legend(ax, options.Legend, 'Box', 'off') end grid(ax, 'on') box(ax, 'on') hold(ax, 'off') end