Matlab 散点图(Scatter)和颜色图(Colormap)

一、什么是散点图?

最初在学习数学和物理时,就已经知道拿到数据要「描点画图」,在密密麻麻的格子纸上标记每一个数据,然后才是用折线或平滑曲线连接。
简单对应在 matlab 的画图函数中,scatter()1 2用来描点,plot() 用来连线。
当然也可以对 plot() plot3() 补充 '.' 'o' 参数来将绘图指定为不带线的标记3,也有人用 plot 规避了 scatter 中的 legend 问题(我的matlab没有遇到类似问题,可能是版本原因4)。5 但 scatter() 对点图的处理的灵活性上还是要远远大于 plot() 的(后续可能会比较一下两种方法)。

二、什么数据需要用散点图来呈现?

最初接触到 matlab 画图大多是从 plot() 函数开始的,但其实 scatter() 得到的散点图才是最原始的数据。如果数据之间不存在先后的联系(比如物理实验中小球从轨道划出后在纸上的落点位置,以及其他统计结果)或者本身数据还需要剔除一些明显错误的点,盲目用线(无论是折线还是平滑曲线)连起来是不可取的,这时就需要用到散点图了。
(除了基本操作,散点图的其他用途了解还有限)

三、matlab 中的颜色如何表示和调用?

MATLAB 中的画图的颜色是依据 colormap6 来显示的,scatter() 等函数中可以用一组 vector 直接指定色序。

ColorOrder & LineStyleOrder

关于什么是「色序 ColorOrder」以及色序的指定问题,可以参考:
为何绘图线条有不同颜色?

统一指定同一坐标轴下多个数据集的颜色,可以参考:
控制绘图函数如何选择颜色和线型
对于早期 matlab 版本,颜色和线型的选择可以通过设置(或移除)默认参数来实现:
用于绘图的线型 - LineStyleOrder

PS. 好想拥有好看的配色啊,专属 colormap 什么的

应用实例

总结一些用过的颜色设置相关语句:

ax = gca;
ax.LineStyle = '-';
co = get(groot,'defaultAxesColorOrder'); % 得到默认色序
ax.ColorOrder = co; % 指定色序
ax.ColorOrderIndex = 1; % 重置色序
% comment: 为什么要多此一举呢?
% 因为在双y轴情况下右侧轴会出现只改变线形而不改变颜色的情况,如果希望线性固定,按照默认色序改变线条颜色,就要重新指定一下。
ax.LineStyleCyclingMethod = "aftercolor"; % 指定多线循环模式,from MATLAB-R2023a

PS. 自 R2023a 起
使用多种颜色和线型时,您可以通过设置 LineStyleCyclingMethod 属性来指定绘图是先循环使用所有线型再循环使用所有颜色、先循环使用所有颜色再循环使用所有线型还是同时循环使用两者。7
在这里插入图片描述

四、颜色和透明度在散点图中的灵活应用

散点图可以用颜色标记数值的大小8。为了更清晰展示结果,颜色和数值的对应可以在 colorbar 中标示,也可以用 text 标记具体点的数值9

二维散点图

三维散点图

数据分组!

快速分析统计到的数据:Create Scatter Plots Using Grouped Data
matlab 实例:四行代码得到的一张图,见上文链接
能快速画出统计图,得益于已经记录完整的数据。把相关的帮助链接贴在下面,按需阅读:
数据类型
Grouping Variables 定义
分类数组 categorical 定性数据数组,其值来自于离散、非数值数据的有限集合
表 table
数据预处理
数据的预处理
函数
gplotmatrix Matrix of scatter plots by group

五、Scatter 的常见属性

Scatter 所有的属性设置10

(后续根据经验再补充常用属性设置)

如何设置图形属性

内容类属性

格式类属性

六、问题解决:加上色序设置后 scatter 不出图的问题

指定色序时的结果
警告内容

不指定色序时的结果
画图程序来源9

勉强可用的解决方案

下面是 scatter(x,y,sz,c)scatter3(x,y,z,sz,c) 中对输入变量 c 的描述。最后一种方法存在问题,可以转而使用第三种来实现类似的(从 colormap 设置颜色的)操作。

Marker color, specified as a color name, RGB triplet, matrix of RGB triplets, or a vector of colormap indices.
Color name — A color name such as “red”, or a short name such as “r”.
RGB triplet — A three-element row vector whose elements specify the intensities of the red, green, and blue components of the color. The intensities must be in the range [0,1]; for example, [0.4 0.6 0.7]. RGB triplets are useful for creating custom colors.
Matrix of RGB triplets — A three-column matrix in which each row is an RGB triplet.
Vector of colormap indices — A vector of numeric values that is the same length as the x and y vectors.

clc,clear,close all

% 生成数据
n=[1:50];
xn=n./(n+1);

% 用 vector 的方式指定 Marker color 
% c = linspace(1,10,length(n)); % 指定色序画图失败

% 用 RGB triplet 的方式指定 Marker color
% 选择 colormap
% co = [0 0 1;
%       0 0.5 0;
%       1 0 0;
%       0 0.75 0.75;
%       0.75 0 0.75;
%       0.75 0.75 0;
%       0.25 0.25 0.25]; % 自己写一个 colormap
co = colormap("cool"); % 或读取 matlab 自带 colormap

% 对 colormap 进行插值(相当于手动操作色序选择)
[Xq,Yq] = meshgrid(1:size(co,2),linspace(1,size(co,1),length(n)));
c = interp2(1:size(co,2),1:size(co,1),co,Xq,Yq); % 行数和数据长度相同

% 查看对 colormap 的插值结果
% 这里相当于从 256 组 RGB triplet 中抽取了 50 组
figure
subplot(121);mesh(co);title('原始 colormap')
xticklabels({
    
    'R','G','B'})
subplot(122);mesh(c); title('插值后') 
xticklabels({
    
    'R','G','B'})

% 画图
figure
scatter(n,xn,[],c,'filled');

可以显示渐变色彩的散点图了
对 colormap 的插值结果示意


  1. 散点图-MATLAB ↩︎

  2. 三维散点图-MATLAB ↩︎

  3. 三维点或线图 ↩︎

  4. https://www.ilovematlab.cn/thread-526221-1-1.html?_dsign=6e07e44b ↩︎

  5. https://blog.csdn.net/mayubins/article/details/124738000 ↩︎

  6. 查看并设置当前颜色图-MATLAB ↩︎

  7. 坐标区的外观和行为-MATLAB(LineStyleCyclingMethod) ↩︎

  8. https://blog.csdn.net/justKidrauhl/article/details/82492986 ↩︎

  9. https://blog.csdn.net/KEEPace_6/article/details/125373466 ↩︎ ↩︎

  10. 散点图的外观和行为-MATLAB ↩︎

猜你喜欢

转载自blog.csdn.net/RainaRaina/article/details/131482014