MATLAB离散数据绘图:从stem到scatter的实战指南

发布时间:2026/10/13 5:23:51
MATLAB离散数据绘图:从stem到scatter的实战指南 1. 离散数据绘图到底在解决什么问题很多人第一次接触 MATLAB 绘图都是从一条光滑的连续曲线开始的。比如定义一个x 0:0.01:2*pi再算一个y sin(x)plot(x,y)一敲一条漂亮的曲线就出来了。这种场景下数据点足够密视觉上就是连续的绘图本身没什么难度。但真正到了工程现场、实验台、数据采集系统里你拿到的数据往往不是这样的。它们是一组一组离散的采样点可能是每隔几秒采一次的温度值可能是某个传感器输出的脉冲序列也可能是从 Excel 里导入的一列实验数据。这些数据点之间没有天然的连续函数关系点与点之间的间隔也不均匀甚至有些点本身就是异常值。这时候如果还直接plot一条线连过去画出来的图要么失真要么误导要么根本看不出数据本身的分布特征。离散数据绘图要解决的核心问题就是如何把一组没有解析表达式的数据点用最合适的方式呈现出来让数据本身的规律、趋势、异常和分布特征被准确、清晰地表达出来。它和连续函数绘图最大的区别在于连续函数绘图是在画函数离散数据绘图是在画数据。前者关心的是曲线的形状后者关心的是数据点的位置、密度、分布和相互关系。这个区别决定了离散数据绘图在方法选择、参数设置、图形类型上都有自己的一套逻辑。我见过不少刚入门的同学拿到一组实验数据不管三七二十一就是plot(x,y)结果画出来的图要么是一条折线连着一堆毛刺要么是点太密糊成一团要么是点太稀看不出趋势。其实 MATLAB 为离散数据提供了非常丰富的绘图工具从最基础的stem、scatter、bar到stairs、errorbar、histogram再到三维的scatter3、stem3每一种都有它最适合的场景。选对了工具图就成功了一半选错了工具后面再怎么调参数都是事倍功半。这篇文章主要面向三类人第一类是刚开始用 MATLAB 做数据分析的学生和研究人员手里有实验数据但不知道怎么画才规范第二类是工程技术人员需要把采集到的离散信号快速可视化用于调试和报告第三类是有一定 MATLAB 基础但想系统梳理离散数据绘图方法体系的人。我会从数据准备、图形类型选择、参数调优、常见坑点几个维度把离散数据绘图这件事讲透尽量做到看完就能上手上手就能出图。2. 数据准备阶段最容易埋下的三个隐患2.1 数据导入后的维度与类型检查离散数据绘图的第一步不是画图而是把数据整理成 MATLAB 能正确处理的格式。这一步看起来简单实际上埋的坑最多。最常见的问题是数据导入后维度不对。比如从文本文件用load或readmatrix读进来有时候得到的是一个 N×1 的列向量有时候是 1×N 的行向量还有时候因为文件里有表头或分隔符问题读进来变成了字符数组或 cell 数组。如果你直接拿一个 cell 数组去plotMATLAB 会报错或者画出莫名其妙的东西。我的习惯是数据读进来之后先做三件事size看维度class看类型isnumeric确认是不是数值型。如果是 cell 或 table先用cell2mat或table2array转成数值矩阵。如果是行向量但你需要列向量用转置.调整。这些操作看起来琐碎但能避免后面 80% 的绘图报错。还有一个容易被忽略的点是数据中的 NaN 和 Inf。实验数据里经常有缺失值导入后变成 NaN。plot遇到 NaN 会自动断开线段这有时候是好事有时候会让图看起来断断续续。如果你不希望断开需要先用fillmissing或插值方法把 NaN 补上。Inf 更麻烦它会让坐标轴范围自动扩展到无穷大整个图被压缩成一条线。所以画图前用sum(isnan(y))和sum(isinf(y))检查一下是个好习惯。2.2 横坐标的构造逻辑索引、时间还是物理量离散数据绘图时横坐标用什么直接决定了图的信息量。很多同学图省事直接plot(y)让 MATLAB 自动用索引 1、2、3……作为横坐标。这样做在快速查看数据时没问题但用于正式分析或报告就不合适了。因为索引没有物理意义读者看不出采样间隔也看不出时间或空间上的对应关系。正确的做法是根据数据的实际含义构造横坐标。如果是等间隔采样比如采样频率是 1000 Hz采样了 500 个点那横坐标应该是t (0:499)/1000单位是秒。如果是不等间隔采样比如事件触发记录那横坐标就是每次事件的时间戳向量。如果是空间数据比如沿一条测线每隔 0.5 米测一个点那横坐标就是x 0:0.5:0.5*(N-1)。这里有个细节横坐标向量的长度必须和纵坐标向量完全一致。我遇到过好几次数据是 1000 个点但时间向量因为舍入误差算出来是 999 个点plot直接报错 Vectors must be the same length。解决办法是用linspace而不是冒号运算符来生成等间隔向量linspace能保证点数精确。比如t linspace(0, 0.499, 500)这样一定是 500 个点。2.3 异常值的识别与处理策略离散数据里出现异常值是常态不是意外。传感器偶尔跳变、记录时手误、传输丢包都会产生远离正常范围的数值。这些点如果不处理画出来的图会被拉得很难看趋势完全被掩盖。但处理异常值要谨慎不能随便删因为有些异常恰恰是真实信号。我的做法是分两步先可视化识别再决定处理方式。用scatter或boxplot先把所有点画出来肉眼看看哪些点明显偏离。然后用统计方法辅助判断比如计算四分位距 IQR把超出Q1 - 1.5*IQR和Q3 1.5*IQR的点标记为疑似异常。对于确认是记录错误的点可以直接设为 NaN 或删除对于可能是真实信号的点保留但在图上用不同颜色或标记标出来提醒读者注意。注意删除异常值之前一定要备份原始数据。我见过有人直接在原数组上操作删完之后想恢复都恢复不了只能重新采集。3. 六种核心离散绘图函数的适用场景拆解3.1 stem 与 stairs脉冲与阶梯信号的专属表达stem画的是火柴杆图每个数据点用一个小圆圈表示从横轴到数据点画一条垂直线。这种图最适合表达脉冲信号、数字序列、频域采样点这类数据。比如你做 FFT 之后得到的频谱每个频率点上的幅值就是离散的用stem画出来一目了然比plot连成折线要准确得多。因为plot会暗示频率点之间有连续过渡而实际上频谱只在离散频点上有定义。stairs画的是阶梯图数据点之间用水平线和垂直线连接形成台阶状。这种图适合表达采样保持信号、累积计数、状态变化这类数据。比如一个计数器每隔一段时间加一用stairs画出来就能清楚看到每个时间段内的值保持不变到下一个时刻才跳变。如果用plot画会变成斜线上升完全歪曲了数据的真实含义。这两个函数的使用方法都很简单stem(x,y)和stairs(x,y)就行。但有几个参数值得调stem的Marker可以改成filled让圆圈实心LineWidth可以加粗垂直线stairs的LineWidth和Color也可以调整。另外stem还有一个stem3版本用于三维数据的火柴杆图后面会讲到。3.2 scatter 与 plot 的点线之争scatter和plot都能画散点但它们的定位完全不同。plot(x,y,o)是在画线的函数里加了个标记本质上还是线图只是不显示线。scatter(x,y)是专门的散点图函数它的优势在于每个点可以有不同的颜色、大小和透明度。这个区别在数据量大或者需要表达第三维信息时特别重要。比如你有三列数据x 坐标、y 坐标、温度值。用scatter(x, y, 30, temp, filled)就能画出每个点大小相同但颜色随温度变化的散点图颜色条一加第三维信息就表达出来了。plot做不到这一点它只能所有点一个颜色。scatter的另一个优势是透明度控制。数据点重叠严重时用MarkerFaceAlpha设置半透明能看出哪些区域点密集、哪些区域稀疏。比如scatter(x, y, filled, MarkerFaceAlpha, 0.3)重叠的点会叠加颜色密度分布一目了然。这个技巧在处理大量采样点时非常实用。但scatter也不是万能的。如果数据点不多而且你想同时看到趋势线那plot更方便一条命令就能同时画线和点。我的经验是数据点少于 200 个、需要看趋势时用 plot数据点多、需要看分布或表达第三维时用 scatter。3.3 bar 与 histogram类别数据与分布数据的区分bar和histogram经常被混用但它们解决的是完全不同的问题。bar画的是类别数据的值横轴是类别标签纵轴是每个类别的数值。比如五个不同实验组的测量结果用bar画出来每组一根柱子高度代表数值大小。横轴是离散的类别不是连续数值。histogram画的是数值数据的分布它先把数据分成若干个区间bin然后统计每个区间内有多少个数据点。横轴是数值范围纵轴是频数或频率。比如你测了 1000 个零件的尺寸想知道尺寸集中在哪个范围就用histogram。这两个函数的参数设置逻辑也不同。bar主要调柱子的宽度、颜色、分组方式grouped或stacked。histogram主要调 bin 的数量或边界BinWidth和NumBins是两个关键参数。bin 选得太少分布被过度平滑bin 太多分布显得毛刺。我一般先用默认值画一遍然后根据数据量调整数据量在 100 到 1000 之间时bin 数取 10 到 30 比较合适。还有一个细节histogram默认画的是频数如果你要画概率密度加一个Normalization,pdf参数。这个在跟理论分布对比时很有用因为理论曲线通常是概率密度函数量纲要对上才能比较。3.4 errorbar带不确定度的数据表达实验数据几乎都带有不确定度只画一个点或者一条线不画误差棒是不严谨的。errorbar就是专门解决这个问题的。它的基本用法是errorbar(x, y, err)其中err是每个点上的误差值可以是标准差、标准误或置信区间半宽。errorbar的强大之处在于它可以分别指定横轴和纵轴的误差。比如errorbar(x, y, yneg, ypos, xneg, xpos)可以画出不对称的误差棒这在某些测量中很常见因为正负误差不一定相等。如果只给一个err那就是上下对称的误差棒。我经常看到有人用plot画完数据后手动加几条线来表示误差这样既麻烦又不规范。直接用errorbar一行命令搞定而且误差棒的样式、颜色、线宽都可以调。配合hold on再画一条拟合线就是一张标准的实验数据图。提示误差棒的长度要基于合理的统计量。如果是多次测量的标准差用std计算如果是单次测量的仪器误差用仪器精度。不要随便估一个数填进去那样图就失去意义了。3.5 三维离散数据scatter3 与 stem3 的取舍当数据有两个自变量和一个因变量时就需要三维绘图。离散三维数据最常用的两个函数是scatter3和stem3。scatter3在三维空间里画点点的颜色和大小可以映射第四维信息。stem3从 z0 平面向每个数据点画垂直线适合表达高度或强度。选择哪个取决于数据特征。如果数据点分布在一个曲面上用scatter3能看出曲面的形状如果数据点是稀疏的、需要强调每个点的高度用stem3更直观。比如地形测量数据点比较密用scatter3加颜色映射能画出类似地形图的效果如果是几个离散测点的高度用stem3更清楚。三维图的一个常见问题是视角。默认视角不一定能最好地展示数据需要用view(az, el)调整方位角和仰角。我一般会多试几个角度找到最能说明问题的那个。另外三维图加颜色条colorbar后读者才能把颜色和数值对应起来这个不能省。3.6 组合绘图hold on 与 yyaxis 的配合实际项目中经常需要把多组离散数据画在同一张图上对比。这时候hold on是基本操作但要注意每次画完一组数据后颜色和标记会自动轮换如果组数多了可能重复。我的做法是显式指定颜色和标记比如plot(x1, y1, o-, Color, [0.2 0.4 0.8])这样每组数据的样式都可控。如果两组数据的量纲差别很大比如一组是温度几十度一组是压力几千帕用同一个纵轴会导致其中一组被压扁。这时候用yyaxis left和yyaxis right创建双纵轴。左轴画温度右轴画压力各自有独立的刻度和标签。但双纵轴图要慎用因为它容易让读者混淆只有在确实需要对比两个量纲不同的序列时才用。4. 让离散图从能看到专业的参数调优4.1 坐标轴范围与刻度的精确控制默认的坐标轴范围是 MATLAB 根据数据自动算的有时候留白太多有时候又太紧。用xlim和ylim手动设置范围能让图更紧凑、重点更突出。比如数据集中在 10 到 20 之间但有一个异常点在 100自动范围会拉到 0 到 100主体数据被压缩。这时候设ylim([9 21])主体就展开了异常点超出范围不显示但你可以用文字标注说明。刻度控制用xticks和yticks。默认刻度是自动的可能出现 0.30000000000000004 这种难看的小数。手动指定刻度值比如xticks(0:0.5:5)刻度就整齐了。刻度标签用xticklabels自定义比如把 1、2、3 改成 低、中、高适合类别数据。还有一个细节是坐标轴的字体和线宽。默认字体偏小放到报告里看不清。用set(gca, FontSize, 12, LineWidth, 1.2)统一调整图会显得更专业。gca是获取当前坐标轴句柄这个用法在调参时非常高频。4.2 标记、线型与颜色的搭配原则离散数据的标记选择有讲究。数据点少时用实心圆点o或方块s比较醒目数据点多时用点.避免标记互相重叠。线型方面实线-表示连续趋势虚线--表示预测或参考点线:表示辅助线。这些约定不是强制的但遵循它们能让图更容易被同行理解。颜色搭配是很多人头疼的问题。MATLAB 默认的颜色顺序是蓝、橙、黄、紫、绿、青、红前几个区分度还可以但到后面就难分了。如果图要打印成黑白颜色区分完全失效这时候必须靠线型和标记来区分。我的建议是如果图可能被黑白打印就用线型标记区分如果确定是彩色显示可以用颜色区分但颜色数量不要超过 5 种。对于需要更高配色要求的场景可以用colormap自定义颜色映射或者用十六进制颜色码指定。比如plot(x, y, Color, #D95319)这是 MATLAB 从 R2014b 开始支持的写法比 RGB 三元组更直观。4.3 图例、标题与标注的信息密度图例不是越多越好而是越准越好。legend的顺序要和plot的顺序一致否则会标错。如果图例项太多考虑用legend(Location,best)让 MATLAB 自动找空位或者干脆把图例放到图外用legend(Location,northoutside,Orientation,horizontal)。标题和轴标签要写清楚物理量和单位。xlabel(时间 (s))比xlabel(时间)好ylabel(温度 (°C))比ylabel(温度)好。单位用括号括起来这是工程图表的通用规范。标题不要写 图1 这种那是文档排版的事MATLAB 里的标题应该描述图的内容比如title(三组传感器温度采样对比)。对于图中的关键点用text或annotation加标注。比如在最大值点旁边标出数值在异常区域画个箭头。text(x, y, 峰值 23.5°C)是最简单的用法annotation(arrow, [x1 x2], [y1 y2])可以画箭头。这些标注能让读者不用猜直接看到你想强调的信息。4.4 导出分辨率与格式的实战选择图画好了导出也有讲究。MATLAB 的saveas和print都能导出图片但默认分辨率可能不够。用于屏幕显示的图150 dpi 就够了用于打印或出版的图至少 300 dpi。用print(-dpng, -r300, figure.png)可以指定 300 dpi 导出 PNG。格式选择上PNG 适合屏幕显示和网页TIFF 适合出版EPS 或 PDF 适合矢量图。如果图里有大量数据点矢量图文件会很大这时候用高分辨率位图更合适。如果图主要是线条和文字矢量图放大不失真更适合。还有一个坑导出的图尺寸和屏幕上看到的不一样。因为屏幕上的图是屏幕分辨率导出时按指定 dpi 重新渲染字体和线宽的相对比例会变。解决办法是导出前用set(gcf, PaperPosition, [0 0 16 12])设置纸张尺寸这样导出的图比例和屏幕一致。5. 那些年我踩过的离散绘图坑5.1 数据点顺序错乱导致的鬼画符这是最隐蔽的坑之一。离散数据如果横坐标不是单调递增的plot会按照数据在数组里的顺序连线画出来的线会来回折返像鬼画符一样。比如你从数据库里查出来的数据按时间排序是对的但按其他字段排序后时间就乱了。这时候直接plot(t, y)线会乱成一团。解决办法很简单画图前先排序。[t_sorted, idx] sort(t); y_sorted y(idx);然后plot(t_sorted, y_sorted)。如果是scatter顺序无所谓因为散点图不连线。所以如果你不确定数据顺序先用scatter看看确认没问题再决定要不要排序画线。还有一种情况是数据里有重复的横坐标值。比如两个不同传感器在同一时刻的记录时间戳相同。plot遇到重复横坐标时会在同一个 x 位置画两个点连线会垂直上下看起来像毛刺。这时候要么用scatter要么把重复点合并取平均或取最后一个要么给不同传感器加微小偏移区分。5.2 大数据量下的渲染卡顿与简化策略当数据点超过十万甚至百万时MATLAB 绘图会明显卡顿旋转三维图更是幻灯片一样。这不是 MATLAB 不行而是渲染这么多图元本身就需要时间。解决办法有几个层次。第一层是降采样。如果数据是等间隔采样的直接每隔 N 个点取一个y_down y(1:N:end)。N 取多大取决于你要保留多少细节一般保证图上还有几千个点就够了。如果是不等间隔数据用interp1重采样到等间隔网格再降采样。第二层是用更适合大数据量的函数。plot在处理大量点时效率不高可以试试line函数直接操作图形对象或者用animatedline做动态显示。对于散点图scatter在大数据量时也比plot慢可以考虑用image或imagesc把数据渲染成图像虽然损失了矢量特性但速度快很多。第三层是分块绘制。如果数据有自然的分段比如按天记录的数据可以一天一天画每次只画当天的数据画完hold on再画下一天。这样每次渲染的数据量小了整体流畅度提升。5.3 图例与数据不对应的排查方法图例标错是另一个高频问题。最常见的原因是hold on之后又画了辅助线比如参考线、拟合线这些线也被算进图例里了。解决办法是给不需要图例的线加HandleVisibility,off参数这样它就不会出现在图例中。还有一种情况是画了多组数据但图例只写了几个。这是因为legend的参数个数和实际曲线数不匹配。MATLAB 会按顺序取前几个后面的就不标了。解决办法是显式指定图例对应的句柄h1 plot(...); h2 plot(...); legend([h1 h2], {数据1,数据2})。这样不管画了多少条线图例只显示你指定的那几条。如果图例位置挡住了数据用legend(Location,best)让 MATLAB 自动找空位或者手动设Location,northwest等。实在不行就把图例放到图外用Location,northoutside。5.4 中文显示乱码的根因与修复中文乱码是 MATLAB 绘图的老问题根源在于默认字体不支持中文。解决办法是设置支持中文的字体比如set(gca, FontName, SimHei)或Microsoft YaHei。但要注意不同操作系统上可用的中文字体不同Windows 上有 SimHei 和 Microsoft YaHeimacOS 上可能要用PingFang SC或STHeiti。更稳妥的做法是在绘图前统一设置默认字体set(0, DefaultAxesFontName, SimHei)这样后面所有图都用这个字体不用每个图单独设。如果导出后中文还是乱码检查导出格式EPS 格式对中文支持不好换成 PNG 或 PDF 通常能解决。还有一个隐藏问题如果图里同时有中文和特殊符号比如希腊字母一个字体可能覆盖不全。这时候用tex解释器MATLAB 会自动切换字体。但tex解释器对中文支持也有限最保险的还是用Interpreter,none关闭解释器直接显示原始字符。6. 从数据到结论一张离散图的分析闭环6.1 用图形特征反推数据质量问题画图不只是展示结果也是检查数据质量的手段。一张离散图能暴露很多数据问题。比如散点图里出现明显的水平或垂直线说明某个传感器卡死了一直输出同一个值。出现周期性的尖峰可能是电源干扰或采样时钟抖动。出现阶梯状可能是量化精度不够相邻值之间跳变太大。我有个习惯拿到新数据先画三种图——scatter看整体分布histogram看数值分布plot看时间序列。三张图一对比数据有没有问题基本就清楚了。如果scatter显示点集中在几个离散值上histogram显示几个尖峰那说明数据量化很粗后续分析要小心。如果plot显示趋势平稳但histogram显示长尾那说明有少量异常值需要处理。6.2 拟合线与置信区间的叠加表达离散数据往往需要拟合一条趋势线帮助读者看出规律。MATLAB 的polyfit和polyval可以做多项式拟合fit函数需要 Curve Fitting Toolbox可以做更复杂的拟合。拟合线用plot叠加在散点图上用不同颜色或线型区分。但只画拟合线不够还要画置信区间。置信区间表达了拟合的不确定度让读者知道这条线有多可靠。用fit函数可以直接得到置信区间用polyfit的话需要自己算。一个简化的做法是用polyparci需要额外函数或者用 bootstrap 方法估计。对于线性拟合我通常用polyfit(x, y, 1)得到斜率和截距然后用polyval算拟合值再用残差的标准差估计置信带。虽然不如专业工具精确但对于快速分析够用了。关键是在图上明确标出这是拟合线不是数据本身避免误导。6.3 多组离散数据的对比呈现技巧对比多组数据时最忌讳的是把所有线画在一起却不加区分。我的做法是分情况处理如果组数少2 到 3 组画在同一张图上用颜色和标记区分图例标清楚如果组数多4 组以上考虑用小多图subplot排列每组一张小图共享坐标轴范围方便对比。subplot的用法是subplot(m, n, p)把图分成 m 行 n 列当前画第 p 个。但subplot的间距是固定的有时候太挤。用tiledlayout和nexttile可以更灵活地控制间距和共享标签。比如tiledlayout(2, 3, TileSpacing, compact)创建 2 行 3 列的布局间距紧凑。如果多组数据的量纲相同但数值范围不同共享纵轴会让小数值的组被压扁。这时候要么用双纵轴要么用归一化处理把每组数据都除以自己的最大值或均值变成相对值再对比。归一化的好处是突出了各组的变化模式代价是丢失了绝对数值信息。用哪种方式取决于你想让读者看到什么。6.4 图形输出的可复现性保障最后说一个容易被忽视的问题可复现性。你今天画了一张图下周想改个参数重新画结果发现数据变了或者代码找不到了。这在项目迭代中很常见。保障可复现性的关键是把绘图代码脚本化数据路径和参数集中管理。我的做法是每个图对应一个独立的脚本文件脚本开头定义数据文件路径和所有可调参数中间是数据处理和绘图代码最后是导出命令。这样任何时候运行脚本都能得到同样的图。参数集中管理的好处是改一个地方全图生效不用在代码里到处找。另外导出图片时在文件名里带上日期和版本号比如temperature_comparison_v2_20250115.png。这样即使后来改了图也能找到历史版本。如果图要用于正式报告把生成图的脚本和数据一起归档别人拿到后能完全复现你的结果。提示MATLAB 的savefig可以保存整个图形窗口包括所有数据和句柄。以后用openfig打开还能继续编辑。对于需要反复调整的图这比导出静态图片方便得多。离散数据绘图这件事说到底就是用最合适的图形语言把数据里的信息准确、清晰地传递给读者。工具和方法都是手段核心是你要清楚自己想表达什么然后选择最能表达那个意思的方式。我刚开始学的时候总想把图调得花哨后来才明白一张好图的标准是读者看一眼就能抓住重点而不是被各种颜色和标记分散注意力。少即是多这句话在数据可视化里特别适用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询