matlab|如何绘制github同款日历热力图(代码片段)

slandarer slandarer     2023-03-09     540

关键词:

应粉丝要求,出一个类似于github热图的日历热力图,大概长这样:

依旧工具函数放在文末,如有bug请反馈并去gitee下载更新版。


使用教程

使用方式有以下几种会慢慢讲到:

  • heatmapDT(Year,T,V)
  • heatmapDT(Year,T,V,MonLim)
  • heatmapDT(ax,Year,T,V)
  • heatmapDT(ax,Year,T,V,MonLim)

基础使用

随便构造一组数据:

% 构造一组比较连续但是有波动的数据
T=datetime(2022,1,1):datetime(2022,12,31);
t=linspace(1,length(T),10);
tV=rand(size(t));
V=interp1(t,tV,1:length(T))+rand(1,[length(T)])./3;

这组数据大概是这样的:

绘制日历热力图并调整大小:

% 绘制日历热图
heatmapDT(2022,T,V)

% 调整图窗和坐标区域大小
set(gcf,'Position',[100,500,1500,260])
set(gca,'Position',[.03,.03,1-.1,1-.1])

修改colormap(当然clim和caxis也能用)。

colormap(pink)

随便再换点颜色:

自己定义点颜色:

CM=[1.0000    1.0000    0.8510
    0.9487    0.9800    0.7369
    0.8617    0.9458    0.6995
    0.7291    0.8938    0.7109
    0.5237    0.8139    0.7308
    0.3433    0.7465    0.7558
    0.2036    0.6610    0.7629
    0.1155    0.5504    0.7444
    0.1298    0.4050    0.6759
    0.1398    0.2788    0.6160
    0.1141    0.1793    0.5162
    0.0314    0.1137    0.3451];
CMX=linspace(0,1,size(CM,1));
CMXX=linspace(0,1,256)';
CM=[interp1(CMX,CM(:,1),CMXX,'pchip'), ...
    interp1(CMX,CM(:,2),CMXX,'pchip'), ...
    interp1(CMX,CM(:,3),CMXX,'pchip')];
colormap(CM)

当然可以配合slanCM配色工具:https://slandarer.blog.csdn.net/article/details/127719784

使用效果:

空缺值

比如数据是2022年的,但是只有前半年数据(有空缺,那么空缺部分会用灰色补齐):

% 构造一组比较连续但是有波动的数据
T=datetime(2022,1,1):datetime(2022,6,30);
t=linspace(1,length(T),10);
tV=rand(size(t));
V=interp1(t,tV,1:length(T))+rand(1,[length(T)])./3;

% 绘制日历热图
heatmapDT(2022,T,V)

% 调整图窗和坐标区域大小
set(gcf,'Position',[100,500,1500,260])
set(gca,'Position',[.03,.03,1-.1,1-.1])

只画部分月份

猜到会有人想要这样的功能,只需要添加MonLim参数[a,b]即可,其中 1 ≤ a ≤ b ≤ 12 1\\leq a\\leq b\\leq 12 1ab12,比如绘制二月热力图:

% 构造一组比较连续但是有波动的数据
T=datetime(2022,1,1):datetime(2022,12,31);
t=linspace(1,length(T),10);
tV=rand(size(t));
V=interp1(t,tV,1:length(T))+rand(1,[length(T)])./3;

% 绘制日历热图
heatmapDT(2022,T,V,[2,2])

% 调整图窗和坐标区域大小
set(gcf,'Position',[100,100,800,600])
set(gca,'Position',[.15,.15,1-.3,1-.3])

2-3月:

heatmapDT(2022,T,V,[2,3])

1-3月:

heatmapDT(2022,T,V,[1,3])

多子图

就将第一个参数设置为坐标区域即可,以下不用随机生成的数据了,用一个matlab Financial Toolbox工具箱自带的数据:

load SimulatedStock.mat 

T=TMW.Time;
V=TMW.High;
 
% 绘制三个热力图
ax1=axes(gcf,'Position',[.06,2/3+.01,1-.07,1/3-.03]);
heatmapDT(ax1,2013,T,V)
ax2=axes(gcf,'Position',[.06,1/3+.01,1-.07,1/3-.03]);
heatmapDT(ax2,2014,T,V)
ax3=axes(gcf,'Position',[.06,0+.01,1-.07,1/3-.03]);
heatmapDT(ax3,2015,T,V)

% 绘制标题并调整位置
TT=title(ax1,'Simulated Stock heatmap','FontSize',18,'FontWeight','bold','FontName','Times New Roman');
TT.Position(2)=-.1;

set(gcf,'Position',[100,100,1200,620])

随便试试自带colormap配色:

随便试试slanCM工具配色:


工具函数完整代码

function heatmapDT(varargin)
% @author:slandarer
% Zhaoxu Liu / slandarer (2023). 
% calendar heatmap (https://www.mathworks.com/matlabcentral/fileexchange/125835-calendar-heatmap), 
% MATLAB Central File Exchange. 检索来源 2023/3/7.

% 参数获取
if isa(varargin1,'matlab.graphics.axis.Axes')
    ax=varargin1;varargin(1)=[];
else
    ax=gca;
end
YY=varargin1;
DT=varargin2;
VAL=varargin3;
MLim=[1,12];
try
    MLim=varargin4;
catch
end

% 截取该年份日期及数值
BeginTime=datetime(YY,1,1);
EndTime=datetime(YY+1,1,1);
VAL=VAL(DT>=BeginTime&DT<EndTime);
DT=DT(DT>=BeginTime&DT<EndTime);
% 范围计算
DayName='Mon','Tue','Wed','Thu','Fri','Sat','Sun';
if MLim>=12
    FDT=datetime(YY,MLim(1),1):(datetime(YY+1,1,1)-1);
else
    FDT=datetime(YY,MLim(1),1):(datetime(YY,MLim(2)+1,1)-1);
end
[DayNumber,~]=weekday(FDT);
DayNumber(DayNumber==1)=8;
DayNumber=DayNumber-1;
TB=tabulate(DayNumber);
XLen=max(TB(:,2));
% 坐标区域修饰
hold on
ax.DataAspectRatio=[1,1,1];
ax.YLim=[.5,7.5];
ax.YDir='reverse';
ax.YTick=1:7;
ax.YTickLabel=DayName;
ax.YAxisLocation='right';
ax.FontName='Monospaced';
ax.FontWeight='bold';
ax.XColor=[.3,.3,.3];
ax.YColor=[.3,.3,.3];
% ax.Title.String=num2str(YY);
ax.FontSize=12;
% ax.LooseInset=[0,0,0,0];
FHdl=fill(ax,ax.XLim([1,1,2,2]),ax.YLim([1,2,2,1]),[1,1,1],'EdgeColor','w','LineWidth',2);
% 绘制灰色方块
xs=[-.5,-.5,.5,.5];ys=[-.5,.5,.5,-.5];
XList=zeros(1,length(FDT)); 
YList=zeros(1,length(FDT));
for i=1:length(FDT)
    XList(i)=sum(DayNumber==1&(1:length(FDT)<=i))+1;
    YList(i)=DayNumber(i);
    fill(ax,xs+XList(i),ys+YList(i),[.8,.8,.8],'EdgeColor','w','LineWidth',1)
end
% 绘制热力方块
for i=1:length(FDT)
    tPos=find(FDT(i)==DT, 1);
    if ~isempty(tPos)
        fill(ax,xs+XList(i),ys+YList(i),VAL(tPos),'EdgeColor','w','LineWidth',1)
    end
end
% 绘制外轮廓
MonNumber=month(FDT);
XDList=zeros(1,MLim(2)-MLim(1)+1);
n=1;
for i=MLim(1):MLim(2)
    XU=XList(MonNumber==i&DayNumber==1);
    plot([min(XU)-.5,max(XU)+.5],[.5,.5],'Color',[0,0,0],'LineWidth',1);
    XD=XList(MonNumber==i&DayNumber==7);
    XDList(n)=mean(XD);n=n+1;
    plot([min(XD)-.5,max(XD)+.5],[7.5,7.5],'Color',[0,0,0],'LineWidth',1);
    YL=YList(MonNumber==i&XList==max(XU));
    plot([max(XU)+.5,max(XU)+.5],[min(YL)-.5,max(YL)+.5],'Color',[0,0,0],'LineWidth',1);
    plot([max(XU)-.5,max(XU)-.5],[min(max(YL)+1,8)-.5,7+.5],'Color',[0,0,0],'LineWidth',1);
    plot([max(XU)+.5,max(XU)-.5],[max(YL)+.5,max(YL)+.5],'Color',[0,0,0],'L

r语言ggplot2可视化:可视化时间序列日历热力图日历热力图可以很好地描绘极端值和节日数据特性(calendarheatmap)例如日历上看到股票价格这样的指标的变化,尤其是高点和低点数据

R语言ggplot2可视化:可视化时间序列日历热力图、日历热力图可以很好地描绘极端值和节日数据特性(CalendarHeatmap)、例如、日历上看到股票价格这样的指标的变化,尤其是高点和低点数据目录 查看详情

用ggplot绘制热力图#r

1、绘制中国地图library("maptools")china_map=readShapePoly("D:/Astatistics/R/画热力图数据材料/中国省级地图空间数据文件/bou2_4p.shp")#读取地图空间数据plot(china_map)#可以不画 2*、改变投影方式library(ggplot2)ggplot(china_map,aes(x=long,y=lat,gr 查看详情

python绘制热力图(代码片段)

最近在建模时有绘制相关系数矩阵热力图的需要,在此记录一下热力图的基本使用这里使用seaborn库中的的heatmap完成热力图的绘制,我们可以根据图中不同方块颜色来判断变量之间相关系数的大小,接下来介绍heatmap的... 查看详情

python热力图绘制方法—新手教程

参考技术A#Python热力图绘制方法热力图的使用场景有 1.描述数据在空间的密集程度,常见有城市热力图,区域热力图2.描述多个变量之间相关性高低程度#step1准备数据集,读取excel列表内容,usecols=index,这里是表里的第一列不... 查看详情

python绘制相关系数热力图(代码片段)

...图三.设置配色,画出多幅图全部代码:本文讲述如何利用python绘制如上的相关系数热力图一.数据说明和需要安装的库数据是31个省市有关教育的12个指标,如下所示。,在文章最后自取:需要安装如下库:... 查看详情

r语言数据热力图绘制实战(基于原生r函数ggplot2包plotly包)

R语言数据热力图绘制实战(基于原生R函数、ggplot2包、plotly包)目录R语言数据热力图绘制实战(基于原生R函数、ggplot2包、plotly包) 查看详情

可视化神器plotly绘制热力图(代码片段)

...图的文章。今天带来的文章是基于官网和实际案例来讲解如何绘制不同需求下的热力图。Plotly中绘制热力图有3种方式:heatmap、imshow和figure_factory(Plotly的图形工厂函数)官网学习地址:https://plotly.com/python/heatmaps/h... 查看详情

github代码热力图,一键填充(代码片段)

写了一个脚本,用来填充Github的代码提交热力图,效果如下图所示:此脚本支持跨年度,直接提供开始日期和结束日期,即可生成此时间区间的所有GitCommit信息。使用克隆本仓库(https://github.com/lecepin/fill-g... 查看详情

leaflet绘制热力图

时下用的最多的开源二维webgis引擎应该是openlayers与leaflet了,leaflet因其轻量、灵活性得到了越来越多的应用。并且leaflet的插件也非常多,综合使用的话,可以很容易的实现数据的可视化分析与应用1、leaflet-heat插件leaf... 查看详情

在arcgis地图上绘制echarts热力图(heatmap)(代码片段)

在Arcgis地图上绘制Echarts热力图(Heatmap)2018-08-30 10:18 【原创】本文地址:https://www.cnblogs.com/qiaoge0923/p/9562304.html  现如今,Echarts在数据可视化方面早已升入化境,已经不再拘泥于简单的饼图柱状图,已然从平面直角坐标系... 查看详情

无需代码绘制出的热力图,0基础小白也能3分钟上手

这几天老李在后台看到有粉丝私信我,问说经常在网上看到这种热力图,自己也想学,但不知道这种动态的热力图要怎么做。其实方法很多,用Excel、FineBI、R语言等都可以实现我分别用这三种方法试了一下1、用Exc... 查看详情

r语言使用pheatmap绘制热力图(数据归一化行列聚类注释文字角度字体)

R语言使用pheatmap绘制热力图(数据归一化、行列聚类、注释、文字角度、字体)目录 查看详情

r语言绘制地图热力图

参考技术A参考https://blog.csdn.net/fanfanrenrenmi/article/details/52565429https://my.oschina.net/u/2306127/blog/473842](https://my.oschina.net/u/2306127/blog/473842这两篇文章中已经写的很详细,那就开始比着做吧虽然之前很少用R做过地图https://pan.baidu.com/s/1jIicF... 查看详情

.可视化数据分析图表—常用图表的绘制3—散点图,面积图,热力图(代码片段)

第五章.可视化数据分析图5.3常用图表的绘制3—散点图,面积图,热力图本节主要介绍常用图表的绘制,主要包括散点图,面积图,热力图。1.散点图(matplotlib.pyplot.scatter)·散点图主要用来查看数据的... 查看详情

echarts图表——地图&热力图

参考技术A地图是依据一定的绘制法则,使用制图方法,通过制图综合在一定的载体上,表达地球(或其他天体)上各种事物的空间分布、联系及时间中的发展变化状态绘制的图形。以特殊高亮的形式显示访客热衷的页面区域和... 查看详情

如何制作炫酷的热力图

如何制作炫酷的热力图来自:http://mp.weixin.qq.com/s/s85vBmTv1GdzozQMWjY6xA2017-11-07 ArcGIS带你飞  飞言飞语 Attention “热力图”是描述趋势变化强力武器,可以将报告内容瞬间提升一个档次,不过,制作“热力... 查看详情

github代码热力图,一键填充(代码片段)

写了一个脚本,用来填充Github的代码提交热力图,效果如下图所示:此脚本支持跨年度,直接提供开始日期和结束日期,即可生成此时间区间的所有GitCommit信息。使用克隆本仓库(https://github.com/lecepin/fill-g... 查看详情

python遥感图像处理应用篇(二十四):python绘制遥感图像各波段热力图(相关系数矩阵)(代码片段)

给多光谱遥感图像各个波段绘制热力图,首先需要计算波段之间的相关系数矩阵,而计算遥感图像波段相关系数矩阵有不同的方法,常用的我们可以采用遥感图像处理软件计算,比如ENVI软件就可以计算相关系数矩阵,使用工具... 查看详情