電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 93|回復(fù): 0
收起左側(cè)

MATLAB|熱力日歷圖

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-11-4 10:35:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方藍(lán)字和“好玩的MATLAB”一起快樂(lè)玩耍吧!

好玩的matlab
帶你解鎖不一樣的matlab新玩法

今天介紹一下熱力日歷圖,喜歡此推文的小伙伴們記得點(diǎn)+關(guān)注+分享!【尊重作者勞動(dòng)成果,轉(zhuǎn)載請(qǐng)注明推文鏈接和公眾號(hào)名】

效果圖



熱力日歷圖介紹熱力日歷圖是一種數(shù)據(jù)可視化形式,它結(jié)合了傳統(tǒng)日歷的布局和熱力圖的顏色編碼系統(tǒng),用來(lái)表示時(shí)間序列數(shù)據(jù)的強(qiáng)度或數(shù)值。每個(gè)日歷單元(通常是日)根據(jù)其對(duì)應(yīng)的數(shù)據(jù)值被涂上不同的顏色。這種圖表特別適合于展示隨時(shí)間變化的模式,如溫度變化、銷售數(shù)據(jù)、網(wǎng)站流量或任何可以按天聚合的指標(biāo)。
熱力日歷圖的特點(diǎn):時(shí)間維度展示:按照標(biāo)準(zhǔn)日歷的格式,將數(shù)據(jù)映射到特定的日期上,方便用戶理解數(shù)據(jù)在時(shí)間上的分布。用戶可以快速識(shí)別出數(shù)據(jù)中的周期性模式、異常值或趨勢(shì)。顏色編碼:通過(guò)顏色的深淺來(lái)表示數(shù)據(jù)的量級(jí),直觀顯示數(shù)值的大小。常用的顏色映射包括從藍(lán)色(代表低值)到紅色(代表高值)的漸變,或者使用如jet、hot、cool或者自定義顏色等MATLAB預(yù)設(shè)的顏色映射。應(yīng)用場(chǎng)景:熱力日歷圖可以用在許多不同的領(lǐng)域和場(chǎng)景,包括:
  • 地理信息:月天氣溫度、濕度、降雨量、河流流量等情況個(gè)人習(xí)慣追蹤:如記錄運(yùn)動(dòng)、睡眠、飲食等日;顒(dòng)數(shù)據(jù)。業(yè)務(wù)分析:比如銷售數(shù)據(jù)的日歷視圖,展現(xiàn)不同時(shí)間段的銷售強(qiáng)度。健康監(jiān)測(cè):追蹤患者的體溫變化或者其他健康指標(biāo)。網(wǎng)站分析:顯示網(wǎng)站每日訪問(wèn)量,突出高流量日期。項(xiàng)目管理:標(biāo)記項(xiàng)目的里程碑和截止日期,追蹤項(xiàng)目進(jìn)度。
    繪圖工具箱HeatmapCalendar【點(diǎn)贊、收藏=學(xué)會(huì)】
  • classdef HeatmapCalendar    %--------------------------------------------------------------------------    % @Author: 好玩的Matlab    % @公眾號(hào):好玩的Matlab    % @Created: 11,02,2023    % @Email: 2377389590@qq.com    % 尊重勞動(dòng)成果,轉(zhuǎn)載請(qǐng)備注推文鏈接和公眾號(hào)名,嚴(yán)禁商用。    %--------------------------------------------------------------------------    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('數(shù)據(jù)和當(dāng)月時(shí)間數(shù)據(jù)不一致')            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這個(gè) HeatmapCalendar 類是一個(gè) MATLAB 類,用于根據(jù)提供的數(shù)據(jù)繪制一個(gè)帶有顏色映射的日歷。下面是一個(gè)逐段的解釋:
    屬性 (Properties)Data:包含用于繪制日歷的數(shù)據(jù)。Year:年份,用于計(jì)算日期和確定日歷布局。Month:月份,用于計(jì)算日期和確定日歷布局。Colormap:一個(gè)顏色映射,用于根據(jù) Data 的值給日歷的每一天上色。默認(rèn)為 hsv(255),這是MATLAB中的一個(gè)預(yù)設(shè)顏色映射。CMapNum:顏色映射中的顏色數(shù)量,默認(rèn)為255。構(gòu)造函數(shù) (Constructor)HeatmapCalendar(varargin):這個(gè)構(gòu)造函數(shù)接受鍵值對(duì)參數(shù),允許用戶在創(chuàng)建類的實(shí)例時(shí)設(shè)置屬性。如果提供了參數(shù),它將設(shè)置相應(yīng)的屬性,并在完成后立即調(diào)用 plot 方法來(lái)繪制日歷。公共方法 (Methods)plot:這是一個(gè)用于繪制日歷的方法。它使用 Data, Year, Month 和 Colormap 屬性。方法執(zhí)行以下步驟:計(jì)算月份的第一天和天數(shù)。計(jì)算需要的周數(shù)(日歷的行數(shù))。在日歷上繪制天數(shù)和對(duì)應(yīng)的顏色。根據(jù) Data 值的范圍,使用顏色映射對(duì)每天的格子進(jìn)行上色。繪制色標(biāo) (colorbar),設(shè)置色標(biāo)的屬性,如線寬、刻度長(zhǎng)度、方向和字體。私有方法 (Private Methods)makeColorMap:這是一個(gè)輔助方法,用于從一個(gè)給定的顏色列表創(chuàng)建一個(gè)顏色映射。這個(gè)方法通過(guò)插值來(lái)生成指定數(shù)量的顏色,以便用于日歷的顏色編碼。
    使用方法默認(rèn)方法
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);

    設(shè)置顏色數(shù)據(jù)量
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.CMapNum=4;P.plot();

    設(shè)置不同的顏色條類型
  • year=2023;month=11;data=rand(eomday(year,month),1)*100;P=HeatmapCalendar('Data',data,'Year',year,'Month',month);P.Colormap=winter;P.plot();

    自定義顏色條
  • 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();

    全年每月設(shè)置相同的顏色條類型
  • 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)

    全年每月設(shè)置不同的顏色條類型
  • 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)


    - -THE END- -

    源碼下載:gitee下載:https://gitee.com/iDMatlab/HeatmapCalendar

    QQ 群下載:

    fileexchange 下載:

    參考資料
    【1】https://github.com/wa0x6e/cal-heatmap



    送書(shū)活動(dòng)



    包郵贈(zèng)送 「北京大學(xué)出版社贊助《Origin科研繪圖與學(xué)術(shù)圖表繪制從入門到精通》

    1.由淺入深,循序漸進(jìn):本書(shū)以初級(jí)和中級(jí)讀者為對(duì)象,首先從Origin使用基礎(chǔ)講起,再輔以O(shè)rigin在實(shí)際工作中的應(yīng)用案例,幫助讀者盡快掌握利用Origin繪制科技圖形和進(jìn)行數(shù)據(jù)處理的技能。2.步驟詳盡,內(nèi)容新穎:本書(shū)結(jié)合作者多年的Origin使用經(jīng)驗(yàn)與實(shí)際科研工作的應(yīng)用案例,將Origin軟件的使用方法與技巧詳細(xì)地講解給讀者。講解步驟詳盡、內(nèi)容新穎,并輔以相應(yīng)的圖片,使讀者在閱讀時(shí)一目了然,從而快速掌握書(shū)中所講內(nèi)容。3.實(shí)例典型,輕松易學(xué):通過(guò)學(xué)習(xí)實(shí)際案例的具體操作是掌握Origin的方式。本書(shū)通過(guò)綜合應(yīng)用案例,透徹詳盡地講解了Origin在曲線擬合、數(shù)字信號(hào)處理、峰擬合和光譜分析、統(tǒng)計(jì)分析等多個(gè)方面的應(yīng)用。4.全彩印刷:圖表案例精彩呈現(xiàn),帶來(lái)良好的閱讀體驗(yàn),方便理解和學(xué)習(xí)。
    【抽獎(jiǎng)方式及滿足條件】:
    1.關(guān)注「好玩的MATLAB 」公眾號(hào)和視頻號(hào)

    2.給本文點(diǎn)【】+【在看】;
    3.留言區(qū)評(píng)論點(diǎn)贊最多的前3名。
    4.本活動(dòng)只針對(duì)從未獲過(guò)獎(jiǎng)的同學(xué),之前獲過(guò)獎(jiǎng)的小伙伴,不用參加。
    同時(shí)滿足上述4個(gè)條件的讀者朋友,包郵贈(zèng)送一本:
    【開(kāi)獎(jiǎng)時(shí)間】:2023年11月4日夜晚8點(diǎn)
    【領(lǐng)獎(jiǎng)方式】:在開(kāi)獎(jiǎng)時(shí)加小編私人微信:idmatlab
    掃一掃加管理員微信

  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表