
【MATLAB基础绘图第16棒】绘制热图(Heatmap)
·
MATLAB绘制热图(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属性
案例
案例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
更多推荐
所有评论(0)