【MATLAB基础绘图第16棒】绘制热图(Heatmap)

热图(Heatmap)

热图的主要作用是直观展示重点研究对象的差异情况,多用于经济学与工学差异性分析之中。

heatmap函数创建热图

语法

h=heatmap(tbl,xvar,yvar)
h=heatmap(tbl,xvar,yvar,'ColorVariable',cvar)
h=heatmap(cdata)
h=heatmap(xvalues,yvalues,cdata)
h=heatmap(___,Name,Value)
h=heatmap(parent,___)
说明
h = heatmap(tbl,xvar,yvar) 基于表 tbl 创建一个热图,并返回 HeatmapChart 对象。xvar 输入参数指示沿 x 轴显示的表变量。yvar 输入参数指示沿 y 轴显示的表变量。默认颜色基于计数聚合,这种方法计算每对 x 和 y 值一起出现在表中的总次数。可使用 h 在创建热图之后对其进行修改。
h=heatmap(tbl,xvar,yvar,'ColorVariable',cvar) 使用 cvar 指定的表变量来计算颜色数据。默认的计算方法为均值聚合。
h=heatmap(cdata) 基于矩阵 cdata 创建一个热图。热图上的每个单元格对应 cdata 中的一个值。
h=heatmap(xvalues,yvalues,cdata) 指定沿 x 轴和 y 轴显示的值的标签。
h=heatmap(___,Name,Value) 使用一个或多个名称-值对组参数指定热图的其他选项。请在所有其他输入参数之后指定这些选项。
h = heatmap(parent,___) 在由 parent 指定的图窗、面板或选项卡上创建热图。

heatmap属性

MATLAB-中文帮助
在这里插入图片描述

案例

案例1:基本绘制

此案例利用Matlab自带的‘heatmap’命令绘制热图。虽然好看,但有一个问题:其标题、坐标轴标题、字体字号等属性无法分开单独设置。

成图如下:
在这里插入图片描述
MATLAB代码如下:

clc
close all
clear
%% 基础设置
pathFigure= '.\Figures\' ;

figureUnits = 'centimeters';
figureWidth = 30; 
figureHeight = 20;

%% 绘制热图
figure(1) 
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
% 绘制热图:河东地区各站点干旱年内分布图
XName = ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"];
YName = ["景泰", "皋兰","靖远","榆中","临夏","临洮","华家岭","环县","平凉","西峰镇","玛曲","合作","岷县","武都","天水北道区"];
h = heatmap( XName , YName , SPI1Station ,'FontSize',10);
% h.CellLabelColor = 'none';   % 设为 'none' 表明去掉标注值
h.GridVisible = 'off';
% 设置坐标区名字与图的大标题
% h.Title = 'Tiltle';
h.XLabel = '月份';
h.YLabel = '站点';
% 对热图上色—colormap函数
hc = colormap(gca, flipud(hot) );
set(gca,'FontSize',16);   % ,'Fontname', 'Times New Roman'

str= strcat(pathFigure, "Fig.2", '.tiff');
print(gcf, '-dtiff', '-r600', str);

案例2:修改热图的属性

热图的图形包括了x轴名称、y轴名称、x和y的数据、颜色、数据标注、图例等属性,可以通过修改热图函数的返回值的句柄设置其属性。
成图如下:(中文字体为宋体;西文字体为Times New Roman)
在这里插入图片描述
MATLAB代码如下:

clc
close all
clear
%% 基础设置
pathFigure= '.\Figures\' ;

figureUnits = 'centimeters';
figureWidth = 30; 
figureHeight = 20;

figure(2) 
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
% 绘制热图:河东地区各站点干旱年内分布图
XName = ["1\fontname{宋体}月","2\fontname{宋体}月","3\fontname{宋体}月","4\fontname{宋体}月","5\fontname{宋体}月","6\fontname{宋体}月",...
    "7\fontname{宋体}月","8\fontname{宋体}月","9\fontname{宋体}月","10\fontname{宋体}月","11\fontname{宋体}月","12\fontname{宋体}月"];
YName = ["\fontname{宋体}景泰", "\fontname{宋体}皋兰","\fontname{宋体}靖远","\fontname{宋体}榆中","\fontname{宋体}临夏","\fontname{宋体}临洮",...
    "\fontname{宋体}华家岭","\fontname{宋体}环县","\fontname{宋体}平凉","\fontname{宋体}西峰镇","\fontname{宋体}玛曲","\fontname{宋体}合作","\fontname{宋体}岷县","\fontname{宋体}武都","\fontname{宋体}天水北道区"];
h = heatmap( XName , YName , SPI1Station ,'FontSize',10);
h.GridVisible = 'off';
h.FontName='Times New Roman';      % 设置显示的字体
h.FontSize = 14;                                 % 设置显示的字体大小
% 设置坐标区名字与图的大标题
% h.Title = 'Tiltle';
h.XLabel = '\fontname{宋体}月份';
h.YLabel = '\fontname{宋体}站点';
% 对热图上色—colormap函数
hc = colormap(gca, flipud(hot) );
set(gca,'FontSize',16);   % ,'Fontname', 'Times New Roman'

str= strcat(pathFigure, "Fig.2", '.tiff');
print(gcf, '-dtiff', '-r600', str);

案例3:设置部分标签

在数据量较大时,希望只有部分数据备注大小,此时应当如何实现呢?
但标签文字方向貌似不能修改,这还是有点烦人啊

在这里插入图片描述
设置代码如下:

figureUnits = 'centimeters';
figureWidth = 20; 
figureHeight = 12;

% 图形1:绘制热图
figure(2)
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
h = heatmap( rho ,'FontSize',10);          %  XName, YName,
h.GridVisible = 'off';
h.XDisplayLabels = {'','','','4','','','','8','','','','12','','','','16','','','','20','','','','24'};
h.YDisplayLabels = {' ','2\fontname{宋体}月',' ','4\fontname{宋体}月',' ','6\fontname{宋体}月',' ','8\fontname{宋体}月',' ','10\fontname{宋体}月',' ','12\fontname{宋体}月'};
h.FontName='Times New Roman';      % 设置显示的字体
h.FontSize = 14;                                 % 设置显示的字体大小
% 设置坐标区名字与图的大标题
% h.Title = 'Tiltle';
h.XLabel = '\fontname{宋体}时间尺度\fontname{Times New Roman}\itSPI';
h.YLabel = '\fontname{宋体}月份';
% 对热图上色—colormap函数
hc = colormap(gca, flipud(hot) );
set(gca,'FontSize',16);   % ,'Fontname', 'Times New Roman'

案例4:部分数值设置特殊标注(如黑点、白框等)

如果想像下面这幅图(出自参考论文1)一样,部分设置标注,该如何实现呢?
在这里插入图片描述
成果图如下所示:
在这里插入图片描述
MATLAB相关代码如下:

figureUnits = 'centimeters';
figureWidth = 20; 
figureHeight = 12;

% 图形2:绘制热图
figure1 =  figure(2);
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
h = heatmap( rho ,'FontSize',10);          %  XName, YName,
h.GridVisible = 'off';
h.XDisplayLabels = {'','','','4','','','','8','','','','12','','','','16','','','','20','','','','24'};
h.YDisplayLabels = {' ','2\fontname{宋体}月',' ','4\fontname{宋体}月',' ','6\fontname{宋体}月',' ','8\fontname{宋体}月',' ','10\fontname{宋体}月',' ','12\fontname{宋体}月'};
h.FontName='Times New Roman';      % 设置显示的字体
h.FontSize = 14;                                 % 设置显示的字体大小
% 设置坐标区名字与图的大标题
% h.Title = 'Tiltle';
h.XLabel = '\fontname{宋体}时间尺度\fontname{Times New Roman}\itSPI';
h.YLabel = '\fontname{宋体}月份';
% 对热图上色—colormap函数
hc = colormap(gca, flipud(hot) );
set(gca,'FontSize',16);   % ,'Fontname', 'Times New Roman'
% t = text( root,'string',"(a) \fontname{宋体}洮河流域", 'Units','normalized','position',[0.02,1.05],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');  
for iMonth=1:12
    FigurePosition = get(gca, 'InnerPosition');
    InnerPosition = [0.13, 0.128208513604737,0.732671957671958,0.796791486395263];
    
    xStart = FigurePosition(1,1)+FigurePosition(1,3)*index(iMonth)/24-0.024;  
    yStart = FigurePosition(1,2)+FigurePosition(1,4)*(1- iMonth/12)+0.0195;
    
    % 创建 rectangle
    annotation(figure1,'rectangle',...
        [xStart, yStart, 0.016, 0.03],...
        'Color',[1 1 1],...
        'FaceColor',[1 1 1],'FaceAlpha',.9);
end

案例5:添加显著水平**/*等

若想得到以下图形(出自参考论文1),该如何实现呢?
在这里插入图片描述

参考

1、参考论文-J2016-From meteorological to hydrological drought using standardised indicators

  • 10
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WW、forever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值