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

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

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

MATLAB|熱力日歷圖

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級會員

Rank: 3Rank: 3

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

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

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

效果圖



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



    送書活動



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

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

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

  • 回復(fù)

    使用道具 舉報

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

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


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