电子产业一站式赋能平台

PCB联盟网

搜索
查看: 170|回复: 0
收起左侧

MATLAB|热力日历图

[复制链接]

260

主题

260

帖子

1833

积分

三级会员

Rank: 3Rank: 3

积分
1833
发表于 2023-11-4 10:35:00 | 显示全部楼层 |阅读模式
点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!7 V% z( @( s# z- c: X( E5 ]" b

a5ujkqciyar64012787649.jpg

a5ujkqciyar64012787649.jpg
) V) {% @0 m5 _$ m; c, b, \8 j+ u# y
好玩的matlab# N5 K9 X+ V" Y. I
带你解锁不一样的matlab新玩法. S6 U3 X+ N! \5 N6 e+ B& y

7 Y2 c4 O2 x- H" C- l' t- |今天介绍一下热力日历图,喜欢此推文的小伙伴们记得+关注+分享【尊重作者劳动成果,转载请注明推文链接和公众号名】
. e: B0 @9 k: o6 }5 k; [4 A$ a5 o  ]4 m$ }; c; R7 A
效果图3 l! W. R" O/ m7 B, g' b% X% \
1 T# V3 v8 l8 Q, T, y

yrl1pi3u5u564012787749.png

yrl1pi3u5u564012787749.png
. E4 R6 V0 h+ O) R/ J, h

pwpelp2hz2364012787849.gif

pwpelp2hz2364012787849.gif

  p/ |' g: F( u* H$ R3 H3 I$ A. O! z" U热力日历图介绍热力日历图是一种数据可视化形式,它结合了传统日历的布局和热力图的颜色编码系统,用来表示时间序列数据的强度或数值。每个日历单元(通常是日)根据其对应的数据值被涂上不同的颜色。这种图表特别适合于展示随时间变化的模式,如温度变化、销售数据、网站流量或任何可以按天聚合的指标。
4 M; i0 F8 Y, w9 e1 J热力日历图的特点:时间维度展示:按照标准日历的格式,将数据映射到特定的日期上,方便用户理解数据在时间上的分布。用户可以快速识别出数据中的周期性模式、异常值或趋势。颜色编码:通过颜色的深浅来表示数据的量级,直观显示数值的大小。常用的颜色映射包括从蓝色(代表低值)到红色(代表高值)的渐变,或者使用如jet、hot、cool或者自定义颜色等MATLAB预设的颜色映射。应用场景:热力日历图可以用在许多不同的领域和场景,包括:
" y3 y* j9 O: F# R
  • 地理信息:月天气温度、湿度、降雨量、河流流量等情况个人习惯追踪:如记录运动、睡眠、饮食等日常活动数据。业务分析:比如销售数据的日历视图,展现不同时间段的销售强度。健康监测:追踪患者的体温变化或者其他健康指标。网站分析:显示网站每日访问量,突出高流量日期。项目管理:标记项目的里程碑和截止日期,追踪项目进度。
    ' n8 C. C, S8 r8 T# _1 b  P& e
    绘图工具箱HeatmapCalendar【点赞、收藏=学会】! ~+ ]& \4 I# ~; l
  • classdef 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 类,用于根据提供的数据绘制一个带有颜色映射的日历。下面是一个逐段的解释:
    8 A; y* h9 [( N( G) s  @+ }9 z3 }属性 (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:这是一个辅助方法,用于从一个给定的颜色列表创建一个颜色映射。这个方法通过插值来生成指定数量的颜色,以便用于日历的颜色编码。' J" A; V- H7 R
    使用方法默认方法
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);5 C: V) [6 }/ c& n& U5 x

    yl0xnrjjes464012787949.png

    yl0xnrjjes464012787949.png

    : ~# \  h: l$ S设置颜色数据量
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.CMapNum=4;P.plot();; H" L$ G* K- P9 K. d6 g6 n  F

    dkdh0f5zies64012788049.png

    dkdh0f5zies64012788049.png

    7 \$ u! k$ k1 O9 X- @3 p设置不同的颜色条类型
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.Colormap=winter;P.plot();
    . }; |! j% N7 V0 F3 c* P2 c

    ve51fjjtpxi64012788149.png

    ve51fjjtpxi64012788149.png

    ' G8 q* {- h1 L# P& C( _: P9 U自定义颜色条
    : Y( M6 `$ @- v* d+ ~
  • year=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();
    7 W" j! p1 M; Q& B! x" I1 v

    cbktk5hv3zs64012788249.png

    cbktk5hv3zs64012788249.png
    - K  W) B0 O. k' J7 F
    全年每月设置相同的颜色条类型
    7 l, T9 B: M# e  Z; Y
  • 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)
    , D7 j8 [( r* C$ b8 q0 P( C6 H

    p0xmgyf0fmx64012788350.png

    p0xmgyf0fmx64012788350.png

    $ |. c  \7 F7 u, \全年每月设置不同的颜色条类型
    2 c5 w* @: @$ k$ s4 p3 V
  • 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)
    " i  t5 I1 J& n) O- z: r3 [  z

    agbkgf4nlqq64012788450.png

    agbkgf4nlqq64012788450.png

    % ^5 B( p' {  U9 P% w* f  s4 p+ V2 w3 j* R
    - -THE END- -7 r- s. @3 L3 n
    0 @4 X, ]) e3 @
    源码下载:gitee下载:https://gitee.com/iDMatlab/HeatmapCalendar
    . a* @/ w& @; {

    bpfydhlfoub64012788550.png

    bpfydhlfoub64012788550.png
    4 K$ A" g# }! b. _! Y1 C
    QQ 群下载:
    9 T9 g0 j* E4 k" y- j% x) I! [

    xjhth1iou1n64012788650.png

    xjhth1iou1n64012788650.png

    0 ]: E: N! x8 _. rfileexchange 下载:% c" o+ h8 x4 Q5 z; L1 d' m

    fhh1k0dcrqr64012788750.png

    fhh1k0dcrqr64012788750.png

    * H( p9 ~- Y2 [4 U3 N/ s4 V/ H) U* @) l参考资料
    ) d# d" `9 Q; d【1】https://github.com/wa0x6e/cal-heatmap3 ]+ e# i) J' u! V. i) i2 X

    6 F+ Y1 U+ p, d  [

    oae2xwoolb164012788850.gif

    oae2xwoolb164012788850.gif

    9 ]( F0 q9 |0 {3 e  G

    w5cxiyckzax64012788950.png

    w5cxiyckzax64012788950.png

    - r  m2 e; L8 t" i/ e送书活动
    " x* t/ Y* R/ c2 S) f! P2 ]; K& R

    mduvkrbzqh264012789050.png

    mduvkrbzqh264012789050.png
    # l/ S& e# M; B) _4 W' m

    lkdr4s0em4064012789151.gif

    lkdr4s0em4064012789151.gif
    2 l, i+ e% G' i) H# f: {: ~
    6 `. l- E& \  y- C
    包邮赠送 「北京大学出版社赞助《Origin科研绘图与学术图表绘制从入门到精通》  \/ i7 V! a9 o, z

    nxdtkbz5byg64012789251.jpg

    nxdtkbz5byg64012789251.jpg

    8 x- r6 A. `' K1.由浅入深,循序渐进:本书以初级和中级读者为对象,首先从Origin使用基础讲起,再辅以Origin在实际工作中的应用案例,帮助读者尽快掌握利用Origin绘制科技图形和进行数据处理的技能。2.步骤详尽,内容新颖:本书结合作者多年的Origin使用经验与实际科研工作的应用案例,将Origin软件的使用方法与技巧详细地讲解给读者。讲解步骤详尽、内容新颖,并辅以相应的图片,使读者在阅读时一目了然,从而快速掌握书中所讲内容。3.实例典型,轻松易学:通过学习实际案例的具体操作是掌握Origin的方式。本书通过综合应用案例,透彻详尽地讲解了Origin在曲线拟合、数字信号处理、峰拟合和光谱分析、统计分析等多个方面的应用。4.全彩印刷:图表案例精彩呈现,带来良好的阅读体验,方便理解和学习。: y/ z, P* X# p: u: F6 H3 x0 `
    【抽奖方式及满足条件】:7 \. Z# @) S( K) h* x/ w. n
    1.关注「好玩的MATLAB 」公众号和视频号0 V2 h* `- G0 b' c( d4 o; D7 q5 z

    ifufgjogu1064012789351.jpg

    ifufgjogu1064012789351.jpg
    , A; b: ^' s- k1 S+ X+ ?% q
    2.给本文点【】+【在看】;
    6 O* X% r7 `% l  a3.留言区评论点赞最多的前3名。
    ' U, A5 s  p4 r4 q' r5 E4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。) n' s' [- {9 p. G! x0 W
    同时满足上述4个条件的读者朋友,包邮赠送一本:3 ~% |- ]2 Y+ ]( H
    【开奖时间】:2023年11月4日夜晚8点0 c' e/ I4 m! A9 {: x- i% u+ i8 d3 ^
    【领奖方式】:在开奖时加小编私人微信:idmatlab
    6 [. w4 E  G8 \( k0 |扫一扫加管理员微信' i8 ]- |3 k/ Z3 E

    qeigauz3qf364012789451.png

    qeigauz3qf364012789451.png
    & J0 N7 i4 T! C! U7 ^" e3 s" p7 D( d

    j3lvsrdk0bh64012789551.jpg

    j3lvsrdk0bh64012789551.jpg
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表