|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
! o& \3 H+ O, b
klxelua2udk64015162142.jpg
8 X9 j% o9 P* W1 H. o" m) b( \
好玩的matlab
% X6 O. U3 l2 q& h. g带你解锁不一样的matlab新玩法* s2 m1 t6 V/ C2 R4 G& b
" p' I; }; [# @" U6 A
今天介绍一下热力日历图,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】9 |9 d$ B5 F/ } q1 [5 h
$ t" P. ]! c/ F2 j( Q1 S6 {8 I
效果图! ~9 w! g% c2 g, p" w4 C
/ R: ^, l1 `, S7 K# W2 K3 @, e
mtccrgfkabu64015162243.png
. g& M8 X) w$ d7 a
ofheoagfb4k64015162343.gif
/ [2 x; O1 j( D2 j2 D2 I
热力日历图介绍热力日历图是一种数据可视化形式,它结合了传统日历的布局和热力图的颜色编码系统,用来表示时间序列数据的强度或数值。每个日历单元(通常是日)根据其对应的数据值被涂上不同的颜色。这种图表特别适合于展示随时间变化的模式,如温度变化、销售数据、网站流量或任何可以按天聚合的指标。
( N' ?( K8 k% V热力日历图的特点:时间维度展示:按照标准日历的格式,将数据映射到特定的日期上,方便用户理解数据在时间上的分布。用户可以快速识别出数据中的周期性模式、异常值或趋势。颜色编码:通过颜色的深浅来表示数据的量级,直观显示数值的大小。常用的颜色映射包括从蓝色(代表低值)到红色(代表高值)的渐变,或者使用如jet、hot、cool或者自定义颜色等MATLAB预设的颜色映射。应用场景:热力日历图可以用在许多不同的领域和场景,包括:5 ?( a1 W z9 }9 r# h* U
地理信息:月天气温度、湿度、降雨量、河流流量等情况个人习惯追踪:如记录运动、睡眠、饮食等日常活动数据。业务分析:比如销售数据的日历视图,展现不同时间段的销售强度。健康监测:追踪患者的体温变化或者其他健康指标。网站分析:显示网站每日访问量,突出高流量日期。项目管理:标记项目的里程碑和截止日期,追踪项目进度。& v- P( e8 Q# j& W2 D
绘图工具箱HeatmapCalendar【点赞、收藏=学会】
* d+ g }) Y9 T8 u1 D, T* Hclassdef HeatmapCalendar %-------------------------------------------------------------------------- % @Author: 好玩的Matlab % @公众号:好玩的Matlab % @Created: 11,02,2023 % @Email: 2377389590@qq.com % 尊重劳动成果,转载请备注推文链接和公众号名,严禁商用。 %-------------------------------------------------------------------------- properties Data Year Month Colormap=hsv(255); CMapNum=255; end methods function obj = HeatmapCalendar(varargin) disp(char([20844 20247 21495 58 22909 29609 30340 77 97 116 108 97 98])) if nargin > 0 for i = 1:2:nargin if strcmpi(varargin{i}, 'Data') obj.Data = varargin{i+1}; elseif strcmpi(varargin{i}, 'Year') obj.Year = varargin{i+1}; elseif strcmpi(varargin{i}, 'Month') obj.Month = varargin{i+1}; elseif strcmpi(varargin{i}, 'Colormap') obj.Colormap = varargin{i+1}; elseif strcmpi(varargin{i}, 'CMapNum') obj.CMapNum = varargin{i+1}; end end end if length(obj.Data)~=eomday(obj.Year,obj.Month) error('数据和当月时间数据不一致') end obj.plot(); end function plot(obj) dayNames = {'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'}; monthNames = {'January', 'February', 'March', 'April', 'May', 'June', ... 'July', 'August', 'September', 'October', 'November', 'December'}; firstDay = weekday(datenum(obj.Year, obj.Month, 1)); daysInMonth = eomday(obj.Year,obj.Month); hold on; numWeeks = ceil((firstDay - 1 + daysInMonth) / 7)+1; title([monthNames{obj.Month},' ',num2str(obj.Year)], ... 'HorizontalAlignment', 'center', 'FontSize', 16, 'FontWeight', 'bold','fontname','Times New Roman'); for i = 1:length(dayNames) text((i-0.5)/7, 1-0.5/numWeeks, dayNames{i}, ... 'HorizontalAlignment', 'center', 'FontSize', 12, 'FontWeight', 'bold','fontname','Times New Roman'); end normalizedData = (obj.Data - min(obj.Data)) / (max(obj.Data) - min(obj.Data)); cmap = colormap(obj.makeColorMap(obj.Colormap,obj.CMapNum)); obj.Colormap=cmap; dayCounter = 1; for i = 2:numWeeks+1 for j = 1:7 left = (j-1)/7; bottom = 1 - i/numWeeks; width = 1/7; height = 1/numWeeks; if dayCounter > daysInMonth rectangle('Position', [left, bottom, width, height], 'EdgeColor', 'none', 'FaceColor', 'none'); elseif i > 1 && j >= firstDay || i > 2 colorIdx = max(1, ceil(normalizedData(dayCounter) * size(cmap, 1))); cellColor = cmap(colorIdx, :); rectangle('Position', [left, bottom, width, height], 'EdgeColor',[1,1,1]*0.95, 'FaceColor', cellColor,'LineWidth',2); text(left + width/2, bottom + height/2, num2str(dayCounter),'Color',1-cellColor, ... 'HorizontalAlignment', 'center', 'FontSize', 14,'FontName','Times New Roman'); dayCounter = dayCounter + 1; else rectangle('Position', [left, bottom, width, height], 'EdgeColor', 'none', 'FaceColor', 'none'); end end end cBar=colorbar; colormap(cBar,obj.Colormap); caxis([min(obj.Data) max(obj.Data)]); cBar.LineWidth = 1.2; cBar.TickLength = 0.015; cBar.TickDirection = 'both'; cBar.FontSize=12; cBar.FontName='Times New Roman'; axis([0 1 0 1]); axis off; pbaspect([1 1 1]); hold off; end end methods(Access=private) function cMap=makeColorMap(obj,colorlist,num) color.Num= num; color.list=colorlist; for col=1:size(color.list,2) x=1:size(color.list,1); xi=linspace(1,size(color.list,1),color.Num); color.map(:,col)=interp1(x,color.list(:,col),xi); end cMap=color.map; end endend这个 HeatmapCalendar 类是一个 MATLAB 类,用于根据提供的数据绘制一个带有颜色映射的日历。下面是一个逐段的解释:% v' U) p7 x! N
属性 (Properties)Data:包含用于绘制日历的数据。Year:年份,用于计算日期和确定日历布局。Month:月份,用于计算日期和确定日历布局。Colormap:一个颜色映射,用于根据 Data 的值给日历的每一天上色。默认为 hsv(255),这是MATLAB中的一个预设颜色映射。CMapNum:颜色映射中的颜色数量,默认为255。构造函数 (Constructor)HeatmapCalendar(varargin):这个构造函数接受键值对参数,允许用户在创建类的实例时设置属性。如果提供了参数,它将设置相应的属性,并在完成后立即调用 plot 方法来绘制日历。公共方法 (Methods)plot:这是一个用于绘制日历的方法。它使用 Data, Year, Month 和 Colormap 属性。方法执行以下步骤:计算月份的第一天和天数。计算需要的周数(日历的行数)。在日历上绘制天数和对应的颜色。根据 Data 值的范围,使用颜色映射对每天的格子进行上色。绘制色标 (colorbar),设置色标的属性,如线宽、刻度长度、方向和字体。私有方法 (Private Methods)makeColorMap:这是一个辅助方法,用于从一个给定的颜色列表创建一个颜色映射。这个方法通过插值来生成指定数量的颜色,以便用于日历的颜色编码。% i4 ^0 @& |7 V/ N: q
使用方法默认方法year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);9 G% K* y: [7 O" C% x
jx513biihom64015162443.png
& z3 ?' `5 ?5 ?7 ~ X3 K设置颜色数据量year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.CMapNum=4;P.plot();
9 P V* |) M; V1 _$ x& x% r
0o4c1xrgddc64015162543.png
, w* R7 _5 s& t2 G设置不同的颜色条类型year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.Colormap=winter;P.plot();0 x7 G2 n3 S& }& w* Y: n4 q5 n
1rou1ziartf64015162643.png
; ~/ O0 {- K; ^1 J! m; @
自定义颜色条
. z( B$ ?+ i3 F( |& `& C fyear=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.Colormap=winter;P.Colormap=[0.0078, 0.0941, 0.7333; 0.9725, 0.0039, 0.5216];P.plot();! d& n- F4 L5 C# ?0 m7 l
3tkyxmerrxn64015162743.png
' z6 Y0 V7 r( V' \7 `" Q2 y
全年每月设置相同的颜色条类型: [. c T1 t# t4 s0 T* Z. u" v; H
clc; close all; clear;figure('Position',[1 72 1512 794])year=2023;colormapList={parula,turbo,hsv,hot,cool,spring,summer,autumn,winter,gray,bone,copper,pink,jet};for month = 1:12 subplot(3,4,month) data=rand(eomday(year,month),1)*100; P=HeatmapCalendar('Data',data,'Year',year,'Month',month); P.Colormap=hsv; P.CMapNum=8; P.plot(); clear dataendsgtitle(num2str(year),'fontName','Times New Roman','FontSize',16)4 N& i- h% B8 I/ I+ _1 g3 y2 B( w$ r
mzvwj4opcm564015162844.png
+ V+ T3 L. @" x3 g' W全年每月设置不同的颜色条类型; e* j; Y E* B. \) U$ P
clc; close all; clear;figure('Position',[1 72 1512 794])year=2023;cMapNum=[3,4,6,8,16,16,16,16,255,255,255,255];colormapList={parula,turbo,hsv,hot,cool,spring,summer,autumn,winter,gray,bone,copper,pink,jet};for month = 1:12 subplot(3,4,month) data=rand(eomday(year,month),1)*100; P=HeatmapCalendar('Data',data,'Year',year,'Month',month); P.Colormap=colormapList{month}; P.CMapNum=cMapNum(month); P.plot(); clear dataendsgtitle(num2str(year),'fontName','Times New Roman','FontSize',16)5 H- i4 c; n2 J1 D. m: r5 }
ijxdjmrmzyk64015162944.png
! L, f, A& |8 o* E. ^0 w
3 G. Z9 a2 R; c, t4 {* `3 q
- -THE END- -5 N$ |+ M4 \# N5 B7 w- q
8 o2 v d' N$ ?$ @( W t; r$ t/ o源码下载:gitee下载:https://gitee.com/iDMatlab/HeatmapCalendar
2 C3 q* K6 z& ], @
txofvmji0aq64015163044.png
$ d" d* P# F7 G; {9 TQQ 群下载:
9 Z6 l2 p3 w$ _4 r+ T9 B
myicfibklkl64015163144.png
3 g& i7 }9 `+ A2 M
fileexchange 下载:
5 c! h0 t- p& V4 d- N
3lzmsmtkmvk64015163244.png
$ z2 w, a. Y# \5 C6 e参考资料+ J) w4 X% I, F$ N+ E. k4 e
【1】https://github.com/wa0x6e/cal-heatmap4 h' |/ Z2 `" K* c3 U$ O8 o0 z
" Y$ z) F* }3 S+ G8 ?/ m |
rqgukhx3y0l64015163344.gif
; q! x$ g! ^5 k, m
dimudllrnl064015163444.png
1 o2 m5 o- C- ^: @4 }) ]) S+ `$ V
送书活动
& J$ k( `" d1 _
51vtyr1dxma64015163544.png
8 _( n$ @$ o) w5 d
i5tiyr20cxx64015163644.gif
! k( @; G) K1 D: ^) n+ q3 Y; B# |
" Y& \* z4 [* B' `/ d4 g& M包邮赠送 「北京大学出版社」赞助《Origin科研绘图与学术图表绘制从入门到精通》
+ C* q6 `4 }7 o2 `* U, Q4 K
p2xm5cghs4c64015163744.jpg
' h! J) l$ K3 o) U6 s$ Z
1.由浅入深,循序渐进:本书以初级和中级读者为对象,首先从Origin使用基础讲起,再辅以Origin在实际工作中的应用案例,帮助读者尽快掌握利用Origin绘制科技图形和进行数据处理的技能。2.步骤详尽,内容新颖:本书结合作者多年的Origin使用经验与实际科研工作的应用案例,将Origin软件的使用方法与技巧详细地讲解给读者。讲解步骤详尽、内容新颖,并辅以相应的图片,使读者在阅读时一目了然,从而快速掌握书中所讲内容。3.实例典型,轻松易学:通过学习实际案例的具体操作是掌握Origin的方式。本书通过综合应用案例,透彻详尽地讲解了Origin在曲线拟合、数字信号处理、峰拟合和光谱分析、统计分析等多个方面的应用。4.全彩印刷:图表案例精彩呈现,带来良好的阅读体验,方便理解和学习。! ~: E( |2 r; q) ?, j* ~( Q
【抽奖方式及满足条件】:8 @! C2 u6 E! b4 G
1.关注「好玩的MATLAB 」公众号和视频号
) K+ Z0 V* M/ V3 j; [
0xhrdkkjr0164015163844.jpg
4 d' O9 m" @! k2.给本文点【赞】+【在看】;, {5 t- ^7 [+ Q5 G) Q* b l
3.留言区评论点赞最多的前3名。2 g4 e% B3 H6 H0 E* w0 F, M
4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。
4 m/ U; K; j! o( S9 v同时满足上述4个条件的读者朋友,包邮赠送一本:
; t; T) F) a9 g3 s: {【开奖时间】:2023年11月4日夜晚8点
0 }, h& s: k& Q3 R/ p! V【领奖方式】:在开奖时加小编私人微信:idmatlab
2 H+ n. D; f5 p9 e扫一扫加管理员微信5 R; `0 v* Z u1 S+ W3 ~. ? B
zzvkiujntij64015163944.png
# c9 s' a1 I7 G+ R
ksuc24aulqe64015164044.jpg
|
|