当遇到需要查看一个二维矩阵数据中值的大小分布情况时可以使用 MATLAB 把矩阵以图像的形式展现出来,这样更直观。MATLAB 的可视化函数之一是 imagesc( ),还有其他的方法,这里只介绍下 imagesc。
目录
1、单一作图
2、同时绘制多图并共用 colorbar
在 matlab 中定义一个 5*5 的矩阵如下:
data = reshape(linspace(1, 25, 25), [5, 5])'
将矩阵 data 直接传入 imagesc( ) 函数即可绘制相应的图像:
imagesc(data);
colorbar; % colorbar 的作用是生成一个代表颜色值的条状图例
颜色像素块的亮度跟矩阵中值的大小有关,值越大对应的像素块就越亮,反之,值越小相应的像素块就越暗。像素块的颜色风格可以更换,使用以下函数:
colormap(cool);
具体的参数有以下这些:
parula turbo hsv hot cool spring summer
autumn winter gray bone copper pink jet
lines colorcube prismflag white
当然也可以自定义,但一般给定的选择就足够用了。
第一种种情况是不共用同一个 colorbar,这样直接使用 subplot(m,n,k) 函数依次创建子图即可:
data = reshape(linspace(1, 25, 25), [5, 5])';
%% 创建一个一行两列的子图,子图的顺序是由左到右,由上到下。当前是第一个子图
subplot(1,2,1);
imagesc(data);
colorbar;
colormap("winter"); % 以最后一个 colormap 的设置为准,不信你试试,这里设置了也没用
ax = gca; % 全称get current axes(个人猜想),获取当前坐标区的属性,用于后续的设置
ax.FontName = 'kaiti'; % 楷体的拼音,经实验,无所谓大小写。如果是英文,可以设置为 'Times New Roman'
ax.FontSize = 10; % 10 号字体
subtitle("这是第一个子图的标题"); % 这是子标题的定义方法
%% 当前是第二个子图
subplot(1,2,2);
imagesc(data);
colorbar;
colormap("summer");
ax = gca;
ax.FontName = 'kaiti';
ax.FontSize = 10;
subtitle("这是第二个子图的标题"); % 这是子标题的定义方法
%% 这是总标题的定义方法
sgtitle(["这是总标题", "像这样使用字符串数组的方式可以实现标题分行"], ...
"FontSize", 15, "Fontname", 'KaiTi');
这第二种情况是一张图中的所有子图共用一个 colorbar,应该也是用的最多的吧?(我猜的)。这时就不能使用 subplot(m,n,k) 函数创建子图了,官方提供的方法是使用 tiledlayout(m, n) 函数和 nexttile 设置子图,看字面意思应该就能明白咋用的了,看一下下面的代码意会吧:
data = reshape(linspace(1, 25, 25), [5, 5])';
%% 创建一个一行两列的子图,子图的顺序是由左到右
tiledlayout(1,2);
%% 当前是第一个子图
nexttile
imagesc(data);
ax = gca; % 全称get current axes(个人猜想),获取当前坐标区的属性,用于后续的设置
ax.FontName = 'kaiti'; % 楷体的拼音,经实验,无所谓大小写。如果是英文,可以设置为 'Times New Roman'
ax.FontSize = 10; % 10 号字体
subtitle("这是第一个子图的标题"); % 这是子标题的定义方法
%% 当前是第二个子图
nexttile
imagesc(data);
ax = gca;
ax.FontName = 'kaiti';
ax.FontSize = 10;
subtitle("这是第二个子图的标题"); % 这是子标题的定义方法
%% 共用 colorbar
cb = colorbar;
cb.Layout.Tile = 'east'; % 这里不知道啥意思的话可以默念:"上北下南, 左西右东"
%% 这是总标题的定义方法
sgtitle(["这是总标题", "像这样使用字符串数组的方式可以实现标题分行"], ...
"FontSize", 15, "Fontname", 'KaiTi');