目录
一、什么是散点图?
最初在学习数学和物理时,就已经知道拿到数据要「描点画图」,在密密麻麻的格子纸上标记每一个数据,然后才是用折线或平滑曲线连接。
简单对应在 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
能快速画出统计图,得益于已经记录完整的数据。把相关的帮助链接贴在下面,按需阅读:
数据类型
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');