


记录一下MATLAB制作热力图的流程,还有一些值得注意的细节。主要包括热图的基本创建方法,热图属性的定义还有相关颜色图的制作。一些热图基本使用方法可见MATLAB官网。
https://ww2.mathworks.cn/help/matlab/ref/heatmap.html?searchHighlight=heatmap&s_tid=srchtitle_support_results_1_heatmap
首先是热图的基本创建,用下面的代码可以创建出如图1所示的热图,这里使用的是随机生产的8*8矩阵,取值范围为[-1,1],使用的颜色图(Colotmap)为jet。图中定义的x,y轴标签是不同的,如果有需要也可以使用相同标签。对于矩阵不是方阵的情况,需要使x轴和y轴标签的个数与矩阵的行列数分别对应,否则会出错。如果不人为设置标签,MATLAB就会使用默认标签,即{1 2 3 4...}。
fig = figure('Position',[100 100 600 600],'Color','white'); % 创建图窗
heat_data = rand(8)*2 - 1; % 初始化数据
xvalues = {'AA' 'BB' 'CC' 'DD' 'EE' 'FF' 'GG' 'HH'}; % x轴标签
yvalues = {'aa' 'bb' 'cc' 'dd' 'ee' 'ff' 'gg' 'hh'}; % y轴标签
h = heatmap(xvalues, yvalues, heat_data,'Colormap',jet); % 创建热图 使用jet颜色

图1 基本热图
显然,基本的热图是不能满足使用需求的。下面给出了一些基本的属性定义方法,包括标题、字体等。为了体现缺失数据的表现方法,这里人为的设置了几个数据空缺。由此可见,绘制热力图时,矩阵中的数据可以有缺失。修改过的热图见图2。
h.Title = "\it Heatmap \rm e^{\pii}+1=0"; % 标题 - 这里用了LaTeX
h.ColorLimits = [-1 1]; % 颜色范围
h.GridVisible = "off"; % 显示网格线
h.ColorbarVisible = "on"; % 显示颜色栏
h.CellLabelColor = "auto"; % 数据标签的文本颜色 - none为不显示,auto为自动
h.CellLabelFormat = '%5.2f'; % 数字格式
h.FontSize = 12; % 字号
h.FontName = 'Times New Roman'; % 字体
h.FontColor = 'black'; % 标题、轴标签和刻度的颜色
h.MissingDataColor = 'white'; % 缺失数据的颜色
h.MissingDataLabel = 'Nan'; % 缺失数据的标签

图2 调节后的热图
值得注意的是,如果标签过长MATLAB会自动把它旋转45°以适应表格尺寸。UP能力有限,现在还没找到能够控制热力图中标签旋转的命令,如果有知道的,欢迎交流。

图3 标签过长的结果
以上就是一些基本的热图设置方法,这些方法其实能很容易在官方文档或者百度上找到,在此不再赘述。接下来讲一下关于颜色图(colormap)的一些自定义方法。
由官方文档,colormap是 “指定为预定义的颜色图名称或定义 种不同颜色的 ×3 RGB(红、绿、蓝)三元组数组。”
官方的颜色有jet、parula、turbo、hsv等等,可见colormap的官方文档。而使用自定义的,大小为m*3的矩阵也能实现自定义颜色的效果,这给了我们更大的自由度,如下定义了一个RGB数组,显示效果如图4。
% m*3 的RGB数组
map = [ 131 26 33
161 61 59
193 109 88
219 162 125
236 208 180
242 235 229
232 237 241
200 214 231
158 188 219
112 145 199
78 112 175
55 80 147]/255;
map = flipud(map); % 让数组上下翻转,使颜色图正数为红色

图4 使用自定义colormap后
可以看到,使用了自定义的颜色后图都变得高级了。但美中不足的是,这个colormap是离散的,两个颜色之间没有过渡。为了使颜色均匀过渡,这里使用255*3的RGB数组,UP通过插值的方式从现有的数组中生成colormap。具体实现方法如下
% m*3 的RGB数组
map = [ 131 26 33
161 61 59
193 109 88
219 162 125
236 208 180
242 235 229
232 237 241
200 214 231
158 188 219
112 145 199
78 112 175
55 80 147]/255;
map = flipud(map); % 让数组上下翻转,使颜色图正数为红色
lin = size(map,1)-1; % 输入矩阵的行数
x = 0:1/lin:1; % 将矩阵行数扩充为255
inter_map1 = interp1(x, map(:,1), 0:1/255:1, 'linear'); % 逐列插值
inter_map2 = interp1(x, map(:,2), 0:1/255:1, 'linear');
inter_map3 = interp1(x, map(:,3), 0:1/255:1, 'linear');
inter_map = [inter_map1' inter_map2' inter_map3']; % 拼接RGB矩阵 此时,我们将colormap改为我们自定义的inter_map,就能实现颜色的均匀过渡。
h = heatmap(xvalues, yvalues, heat_data,'Colormap',inter_map); % 创建热图 使用自定义的colormap

图5 颜色过渡均匀的colormap
如果觉得这样制作colormap太麻烦,官方也提供了一个编辑器即colormapeditor,在命令行窗口输入即可自定义颜色图。