是什么:理解Matlab散点图的基础
散点图(Scatter Plot)是一种在二维或三维坐标系中,以点(通常是圆点或其他符号)的形式显示数据的一种图表。每个点代表一个观测数据,其坐标值由数据集中对应变量的数值决定。在Matlab中,散点图是数据可视化中最常用且功能强大的工具之一,它能够直观地揭示两个或多个变量之间的关系、分布趋势以及潜在的异常值。
当您提到“Matlab画散点图”,通常是指使用Matlab内置的绘图函数,最核心的是scatter函数(用于二维散点图)和scatter3函数(用于三维散点图)。这些函数能够将您的数值数据转换为易于理解的视觉表示。
数据结构要求
绘制散点图的数据通常需要至少两列(或两个向量)数值。例如:
- 二维散点图: 需要一个X坐标向量和一个Y坐标向量,每个向量的长度应相等,分别代表每个数据点的横坐标和纵坐标。
- 三维散点图: 需要一个X坐标向量、一个Y坐标向量和一个Z坐标向量,同样每个向量长度相等,分别代表每个数据点的三维坐标。
为什么:散点图的价值与选择理由
选择散点图作为数据可视化工具并非偶然,它在多个方面都具有独特的优势,使其成为数据分析不可或缺的一部分:
揭示变量间关系
-
相关性分析: 散点图是判断两个连续变量之间是否存在线性、非线性或无关联关系最直接的方式。
- 如果点大致呈一条直线排列,可能存在线性关系(正相关或负相关)。
- 如果点呈曲线趋势,则可能存在非线性关系。
- 如果点分布杂乱无章,则可能没有明显的相关性。
- 趋势发现: 它可以帮助我们快速识别数据的聚集、离散或特定模式。例如,随着一个变量的增加,另一个变量是否倾向于增加或减少。
发现异常点(Outliers)
在散点图中,与大多数数据点明显偏离的点通常被视为异常值。这些异常点可能代表数据录入错误、测量误差或真实的特殊情况。识别它们对于数据清洗和深入分析至关重要。
数据分布与密度
通过点的密集程度,可以大致判断数据在不同区域的分布密度。例如,在某些区域点非常集中,而在另一些区域则非常稀疏。
比较不同数据集或分组
通过为不同组的数据点使用不同的颜色、标记样式或大小,散点图可以清晰地比较不同组别在两个变量上的表现,并观察它们之间的差异或重叠。
何时优先选择散点图?
当您需要回答以下问题时,散点图是理想的选择:
- 两个变量之间是否存在某种关系?(如身高与体重、温度与产率)
- 数据中是否存在异常值?
- 多个变量(通过颜色、大小编码)之间如何相互作用?
- 数据点是如何分布在某个范围内的?
如何:绘制Matlab散点图的基本操作
Matlab提供了简单直观的命令来创建散点图。以下是基本语法和一些常用示例:
最简单的二维散点图
使用scatter(X, Y)函数,其中X是数据点的横坐标向量,Y是数据点的纵坐标向量。
% 假设您有一些实验数据
X_data = 1:0.5:10;
Y_data = 2 * X_data + 3 + randn(size(X_data)) * 2; % 模拟带噪声的线性关系
figure; % 创建一个新的图窗
scatter(X_data, Y_data);
title('简单的二维散点图');
xlabel('X轴数据');
ylabel('Y轴数据');
grid on; % 添加网格线
带大小和颜色的散点图
scatter(X, Y, S, C)函数允许您根据第三个变量(S)控制每个标记的大小,以及根据第四个变量(C)控制每个标记的颜色。S和C可以是标量(所有点大小或颜色相同)或与X、Y长度相同的向量。
S(大小): 如果S是标量,所有点的大小相同。如果S是向量,则每个点的大小由对应元素决定。大小的单位是“点平方”(points^2),默认大小为36。C(颜色): 如果C是标量,所有点颜色相同。如果C是向量,则Matlab会将这些值映射到当前的颜色图中,为每个点分配颜色。C也可以是RGB三元组的矩阵(N x 3),直接指定每个点的颜色。
% 模拟三维数据:X, Y, 和 Z (Z用于控制颜色和大小)
X_vals = randn(1, 100) * 10;
Y_vals = randn(1, 100) * 8;
Z_vals = X_vals.^2 + Y_vals.^2 + randn(size(X_vals)) * 5; % 模拟某种非线性关系
% 设置标记大小和颜色与 Z_vals 相关
marker_sizes = abs(Z_vals) + 10; % 大小与Z的绝对值有关,并加上基数
marker_colors = Z_vals; % 颜色与Z的值有关,Matlab会自动映射到colormap
figure;
scatter(X_vals, Y_vals, marker_sizes, marker_colors, 'filled'); % 'filled' 填充标记点
colorbar; % 添加颜色条,解释颜色映射
title('根据第三个变量改变大小和颜色的散点图');
xlabel('X');
ylabel('Y');
colormap('jet'); % 设置颜色图
三维散点图
使用scatter3(X, Y, Z, S, C)函数,它与scatter类似,但增加了Z坐标维度。
X_3d = rand(1, 100);
Y_3d = rand(1, 100);
Z_3d = rand(1, 100);
Color_3d = X_3d + Y_3d + Z_3d; % 根据三个坐标的和来着色
figure;
scatter3(X_3d, Y_3d, Z_3d, 50, Color_3d, 'filled');
title('三维散点图');
xlabel('X坐标');
ylabel('Y坐标');
zlabel('Z坐标');
colorbar;
colormap('parula');
view(3); % 设置默认三维视角
怎么:散点图的高级定制与优化
绘制出基本散点图后,为了使其更具专业性和表达力,您需要进行细致的定制。Matlab提供了丰富的属性来控制散点图的各个方面。
标记点样式定制
这是散点图最直观的定制部分,通过控制点的外观来增强信息的传达。
标记类型 (Marker属性)
默认是圆形(’o’),您可以选择其他符号:
'o'(圆圈, 默认)'+'(加号)'*'(星号)'.'(点)'x'(叉号)'s'(正方形)'d'(菱形)'^'(上三角形)'v'(下三角形)'>'(右三角形)'<'(左三角形)'p'(五角星)'h'(六角星)
在scatter函数中直接指定:scatter(X, Y, S, C, 'Marker', '*')
标记大小 (SizeData属性)
在scatter函数中通过第三个参数指定,或通过获取散点图对象后修改其SizeData属性。
h = scatter(X, Y); % 获取散点图对象句柄 h.SizeData = 100; % 将所有点的大小设置为100
标记颜色 (CData属性)
在scatter函数中通过第四个参数指定,或通过获取散点图对象后修改其CData属性。可以指定为RGB三元组、预定义颜色名称(如'r', 'g', 'b'等)或颜色映射值。
% 所有点红色
scatter(X, Y, [], 'r');
% 渐变颜色
scatter(X, Y, [], Z, 'filled'); colormap('hot');
% 自定义每个点颜色 (例如,前50个点蓝色,后50个点红色)
colors = zeros(100, 3);
colors(1:50, :) = repmat([0 0 1], 50, 1); % 蓝色
colors(51:100, :) = repmat([1 0 0], 50, 1); % 红色
scatter(X, Y, [], colors, 'filled');
标记边框与填充色 (MarkerEdgeColor, MarkerFaceColor属性)
如果希望点的边框和填充色不同,可以使用这些属性。
scatter(X, Y, 'o', 'MarkerEdgeColor', 'b', 'MarkerFaceColor', 'y', 'SizeData', 80);
透明度 (MarkerFaceAlpha, MarkerEdgeAlpha属性)
对于大量数据点,设置透明度可以帮助显示数据密度。范围从0(完全透明)到1(完全不透明)。
scatter(X, Y, 20, [0 0.5 0.5], 'filled', 'MarkerFaceAlpha', 0.5); % 半透明填充色
图例、标题与轴标签
这些是任何专业图表的标准组成部分,用于解释图表内容。
- 标题:
title('您的图表标题') - 轴标签:
xlabel('X轴名称'),ylabel('Y轴名称'),zlabel('Z轴名称') - 图例:
legend('数据集1', '数据集2', ...)。当绘制多组数据时非常有用。 - 字体与字号: 可以通过获取当前轴句柄或图表句柄后设置其属性。
figure;
h1 = scatter(X_data(1:end/2), Y_data(1:end/2), 'o', 'filled', 'DisplayName', 'A组数据');
hold on; % 允许在同一图上绘制更多内容
h2 = scatter(X_data(end/2+1:end), Y_data(end/2+1:end), 's', 'filled', 'DisplayName', 'B组数据');
hold off;
title('不同组别数据的散点图', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('独立变量', 'FontSize', 12);
ylabel('因变量', 'FontSize', 12);
legend('show', 'Location', 'best'); % 显示图例并自动选择最佳位置
grid on;
多组数据绘制
在同一散点图上展示多组数据可以方便比较。最常用的方法是使用hold on。
- 使用第一个
scatter命令绘制第一组数据。 - 使用
hold on命令。 - 使用后续的
scatter命令绘制其他组数据。 - 使用
hold off命令(可选,确保后续操作不影响当前图)。
% 模拟两组数据
X1 = randn(1, 50); Y1 = 2*X1 + randn(size(X1))*0.5;
X2 = randn(1, 50); Y2 = -1*X2 + randn(size(X2))*0.5;
figure;
scatter(X1, Y1, 50, 'b', 'filled', 'DisplayName', '数据集A'); % 蓝色填充圆点
hold on;
scatter(X2, Y2, 50, 'r', 's', 'filled', 'DisplayName', '数据集B'); % 红色填充方块
hold off;
title('多组数据的散点比较');
xlabel('变量X');
ylabel('变量Y');
legend('show');
grid on;
添加趋势线与拟合
散点图常用于观察变量关系,进一步可以通过添加趋势线来量化这种关系。
- 线性拟合: 可以使用
polyfit和polyval函数进行多项式拟合(线性拟合是1阶多项式)。 lsline: Matlab也提供了一个简便的函数lsline,可以直接在当前轴上添加最小二乘拟合直线。
X_trend = 1:10;
Y_trend = 0.8 * X_trend + 5 + randn(size(X_trend)) * 1.5;
figure;
scatter(X_trend, Y_trend, 60, 'filled', 'MarkerFaceColor', [0.4660 0.6740 0.1880]); % 绿色点
hold on;
% 方法一:使用 polyfit 和 polyval
p = polyfit(X_trend, Y_trend, 1); % 1次多项式拟合(线性)
y_fit = polyval(p, X_trend);
plot(X_trend, y_fit, 'r-', 'LineWidth', 2, 'DisplayName', '线性拟合'); % 红色实线
% 方法二:使用 lsline (会在当前轴上添加线性拟合线)
% lsline; % 如果想用lsline,需要注释掉polyfit的部分,或分开放置
hold off;
title('散点图与线性拟合');
xlabel('X');
ylabel('Y');
legend('原始数据', '拟合曲线');
grid on;
图表美化与细节调整
- 网格线:
grid on;或grid off;。 - 轴范围:
xlim([min_x max_x]),ylim([min_y max_y]),zlim([min_z max_z])。 - 背景颜色:
set(gca, 'Color', [R G B]);(gca表示当前坐标轴)。 - 颜色映射:
colormap('jet'),colormap('parula'),colormap('hot')等,当使用第四个参数C进行颜色映射时非常重要。 - 坐标轴显示:
box on;(显示坐标轴边框)。
处理大量数据点
当数据点数量非常大时(例如数万甚至数十万个点),直接绘制所有点可能会导致图表密集、信息模糊,甚至性能问题。可以考虑以下策略:
-
降低透明度: 使用
MarkerFaceAlpha或MarkerEdgeAlpha属性,让点变得半透明,这样点密集的地方会显得颜色更深,从而显示密度。 - 抽样: 如果数据量过大且对整体趋势的观察更重要,可以随机抽取一部分数据进行绘制。
-
分箱(Binning)或聚合: 将数据区域划分为网格,统计每个网格内的数据点数量,然后使用颜色或大小表示密度。Matlab的
hist2d或自定义分箱逻辑可以实现。 -
使用替代函数: 对于极端大量的数据,考虑使用
plot函数并设置'.'标记,它通常比scatter在处理大量点时性能更好,尽管定制性略低。
哪里:散点图的广泛应用场景
散点图因其直观性,在科研、工程、金融、生物医学等众多领域都有广泛应用:
-
科学研究:
- 物理/化学: 实验数据点(如温度与电阻、反应时间与产物浓度)的关联性分析。
- 生物学: 基因表达水平与疾病发病率、药物剂量与生物响应的量效关系。
-
工程领域:
- 质量控制: 产品尺寸与公差、传感器读数与环境条件的相关性。
- 性能分析: 设备负载与效率、输入功率与输出功率的关系。
-
金融经济:
- 市场分析: 股票价格与成交量、利率与通货膨胀率之间的关系。
- 风险管理: 投资组合中不同资产收益率的相关性。
-
医学与公共卫生:
- 临床研究: 患者年龄与血压、药物剂量与治疗效果。
- 流行病学: 地区环境因素与疾病发病率的关系。
-
数据科学与机器学习:
- 特征工程: 观察不同特征之间的相关性,辅助特征选择。
- 聚类分析: 可视化聚类结果,检查不同簇的分布和分离情况。
多少:关于数据量与维度的一些考量
“多少”在散点图语境中,主要关注的是数据点的数量和图表所能承载的维度。
数据点数量
- 少量数据点(几十到几百): 此时散点图能非常清晰地展示每个点,易于观察其精确位置和趋势。可以充分利用不同的标记、颜色和大小来区分和突出特定数据点。
-
中等数据点(几百到几千): 依然能很好地工作,但点可能会开始有部分重叠。通过调整标记大小、设置透明度、或使用填充标记(
'filled')可以提高可读性。 - 大量数据点(数万或更多): 如果不加处理,图表可能会变得过于密集,形成“墨点图”,难以区分单个点或识别趋势。在这种情况下,之前提到的“处理大量数据点”策略(透明度、分箱、抽样)变得尤为重要。目标是展现数据的整体密度分布而非每个点的细节。
图表维度
- 二维散点图: 最常见,用于展示两个变量(X, Y)的关系。通过颜色(C)和大小(S)这两个额外的视觉编码,可以在二维图上隐含地展示另外两个变量的信息,使其成为“伪四维”图。
-
三维散点图: 直接展示三个变量(X, Y, Z)的关系。同样可以通过颜色(C)和大小(S)来编码另外两个变量,实现“伪五维”可视化。然而,三维图在平面屏幕上可能存在深度感知问题,尤其是在点密集时,可能需要交互式旋转(如使用Matlab的
rotate3d on)才能更好地理解。 - 更高维度: 超过三维的直接散点图绘制变得非常困难。通常会采用降维技术(如主成分分析PCA、t-SNE)将高维数据映射到二维或三维空间再绘制散点图,或者使用多面板图(scatter plot matrix)来展示所有两两变量间的散点图。
怎么:常见问题与解决策略
在绘制Matlab散点图的过程中,用户可能会遇到一些常见问题。理解这些问题并掌握相应的解决策略至关重要。
问题1:图例不显示或显示错误
描述: 即使使用了legend命令,图例也可能不出现,或者图例内容与期望不符。
解决策略:
-
为每个数据系列指定
DisplayName: 最稳妥的方式是在每个scatter函数调用中,通过'DisplayName'属性为该系列命名。然后直接调用legend('show')即可。scatter(X1, Y1, 'DisplayName', '我的数据系列A'); hold on; scatter(X2, Y2, 'DisplayName', '我的数据系列B'); legend('show'); -
获取句柄: 如果没有使用
DisplayName,可以获取每个绘图对象的句柄,然后将这些句柄传入legend函数。h1 = scatter(X1, Y1, 'b', 'filled'); hold on; h2 = scatter(X2, Y2, 'r', 'filled'); legend([h1, h2], '系列一', '系列二');
-
检查
hold on/off状态: 确保在绘制所有需要图例的数据系列之前,使用了hold on。
问题2:标记点重叠严重,无法看清数据分布
描述: 当数据点非常多或者分布非常集中时,点会互相遮盖,导致图表看起来像一团墨迹。
解决策略:
-
调整标记大小: 将
SizeData属性设置得小一些。scatter(X, Y, 5, 'filled'); % 减小点的大小到5
-
设置透明度: 这是最有效的方法之一,通过
MarkerFaceAlpha和MarkerEdgeAlpha属性,让重叠区域显得更深。scatter(X, Y, 20, [0 0 0.8], 'filled', 'MarkerFaceAlpha', 0.3); % 半透明蓝色
-
使用空心标记: 如果填充标记导致问题,尝试使用空心标记,或同时设置填充色和边框色。
scatter(X, Y, 30, 'o', 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'none'); % 黑色边框空心圆
-
考虑数据分箱或密度图: 对于极其密集的数据,散点图可能不是最佳选择。可以考虑使用
hist3进行三维直方图(用于密度)或heatmap等来显示密度。
问题3:颜色和大小映射不直观
描述: 使用第四个参数C或第三个参数S来映射数据时,颜色或大小的变化没有达到预期的视觉效果,或者难以解释。
解决策略:
-
选择合适的颜色图(Colormap): 使用
colormap函数选择一个适合您数据特性的颜色图。例如,对于连续数据,`'jet'`、`'parula'`、`'viridis'`等是常见选择;对于离散分类数据,可能需要自定义颜色。scatter(X, Y, S, C, 'filled'); colormap('viridis'); % 更改颜色图 colorbar; % 添加颜色条解释颜色映射 -
归一化或缩放S和C数据: 确保用于映射大小和颜色的数据(S和C)具有合适的范围。对于大小,通常是正值;对于颜色,Matlab会自动将数据范围映射到当前颜色图的颜色数量,但如果您希望某个特定值对应特定颜色,可能需要手动归一化数据到[0, 1]区间。
% 例如,将C数据归一化到[0, 1] C_normalized = (C - min(C)) / (max(C) - min(C)); scatter(X, Y, S, C_normalized, 'filled'); colormap('hot'); -
明确指定大小范围:
scatter函数的第三个参数是点的大小(点平方),过大或过小都会影响显示。根据实际需要调整。
问题4:导出高质量图片以用于报告或出版物
描述: 直接截图Matlab图窗可能导致图片模糊、分辨率低。
解决策略:
-
使用
print函数: 这是Matlab推荐的导出高质量图片的方法,支持多种格式和分辨率控制。% 导出为高分辨率PNG图片 print('MyScatterPlot.png', '-dpng', '-r300'); % -r300 表示300dpi分辨率 % 导出为矢量图(适合出版物,放大不失真) print('MyScatterPlot.eps', '-depsc'); % EPS格式 print('MyScatterPlot.pdf', '-dpdf'); % PDF格式 - 使用“文件”->“导出设置”: 在Matlab图窗菜单栏选择“文件”->“导出设置...”,可以交互式地调整图片大小、分辨率、字体等,然后导出。
-
调整图窗尺寸: 在导出前,可以通过
set(gcf, 'Position', [left bottom width height])来设置图窗的大小,以确保导出的图片具有合适的比例和尺寸。
掌握了这些基本和高级的散点图绘制技巧,以及常见问题的解决策略,您将能够更有效地利用Matlab进行数据可视化,从而从数据中发现更多有价值的信息。