MATLAB|热力日历图

目录

日历图介绍:

热力日历图的特点:

应用场景:

绘图工具箱

属性 (Properties)

构造函数 (Constructor)

公共方法 (Methods)

私有方法 (Private Methods)

使用方法


日历图介绍:

热力日历图是一种数据可视化形式,它结合了传统日历的布局和热力图的颜色编码系统,用来表示时间序列数据的强度或数值。每个日历单元(通常是日)根据其对应的数据值被涂上不同的颜色。这种图表特别适合于展示随时间变化的模式,如温度变化、销售数据、网站流量或任何可以按天聚合的指标。

热力日历图的特点:

  • 时间维度展示:按照标准日历的格式,将数据映射到特定的日期上,方便用户理解数据在时间上的分布。用户可以快速识别出数据中的周期性模式、异常值或趋势。

  • 颜色编码:通过颜色的深浅来表示数据的量级,直观显示数值的大小。常用的颜色映射包括从蓝色(代表低值)到红色(代表高值)的渐变,或者使用如jet、hot、cool或者自定义颜色等MATLAB预设的颜色映射。

应用场景:

热力日历图可以用在许多不同的领域和场景,包括:

  • 地理信息:月天气温度、湿度、降雨量、河流流量等情况

  • 个人习惯追踪:如记录运动、睡眠、饮食等日常活动数据。

  • 业务分析:比如销售数据的日历视图,展现不同时间段的销售强度。

  • 健康监测:追踪患者的体温变化或者其他健康指标。

  • 网站分析:显示网站每日访问量,突出高流量日期。

  • 项目管理:标记项目的里程碑和截止日期,追踪项目进度。

绘图工具箱

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
    end
end

这个 HeatmapCalendar 类是一个 MATLAB 类,用于根据提供的数据绘制一个带有颜色映射的日历。下面是一个逐段的解释:

属性 (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:这是一个辅助方法,用于从一个给定的颜色列表创建一个颜色映射。这个方法通过插值来生成指定数量的颜色,以便用于日历的颜色编码。

使用方法

默认方法

year=2023;
month=11;
data=rand(eomday(year,month),1)*100;
P=HeatmapCalendar('Data',data,'Year',year,'Month',month);

图片

设置颜色数据量

year=2023;
month=11;
data=rand(eomday(year,month),1)*100;
P=HeatmapCalendar('Data',data,'Year',year,'Month',month);
P.CMapNum=4;
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.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();

图片

全年每月设置相同的颜色条类型

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 data
end
sgtitle(num2str(year),'fontName','Times New Roman','FontSize',16)

图片

全年每月设置不同的颜色条类型

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 data
end
sgtitle(num2str(year),'fontName','Times New Roman','FontSize',16)

图片

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue中的 配置项 setup

setup 是 Vue3 中的一个全新的配置项,值为一个函数。 setup 是所有 Composition API(组合式API)的入口,是 Vue3 语法的基础。 组件中所用到的数据、方法、计算属性等,都需要配置在 setup 中。 setup 会在 beforeCre…

公众号开发实践:用PHP实现通过接口自定义微信公众号菜单

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

解决在表格数据行赋值给表单,会出现表单输入框无法输入的情况

1 直接赋值属性的方法 会出现表单输入框无法输入的情况 handleFixUpdate(row){this.resetForm("formFixUpdate");console.log(this.formFixUpdate)this.formFixUpdate.repairId row.repairIdthis.formFixUpdate.itemId row.itemIdthis.formFixUpdate.repairMan …

Linux开发工具之编辑器vim

文章目录 1.vim是啥?1.1问问度娘1.2自己总结 2.vim的初步了解2.1进入和退出2.2vim的模式1.介绍2.使用 3.vim的配置3.1自己配置3.2下载插件3.3安装大佬配置好的文件 4.程序的翻译 1.vim是啥? 1.1问问度娘 1.2自己总结 vi/vim都是多模式编辑器,vim是vi的升级版本&a…

Flink SQL TopN语句详解

TopN 定义(⽀持 Batch\Streaming): TopN 对应离线数仓的 row_number(),使⽤ row_number() 对某⼀个分组的数据进⾏排序。 应⽤场景: 根据 某个排序 条件,计算 某个分组 下的排⾏榜数据。 SQL 语法标准&am…

启动Hbase出现报错

报错信息:slave1:head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewanggiqi-regionserver-slavel.out’ for reading: No such file or direslave2: head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewangqiqi-regionserver-slave2.out’ for …

无人机航迹规划:六种最新智能优化算法(DBO、LO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、六种算法(DBO、LO、SWO、COA、LSO、KOA)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…

《网络协议》03. 传输层(TCP UDP)

title: 《网络协议》03. 传输层(TCP & UDP) date: 2022-09-04 22:37:11 updated: 2023-11-08 15:58:52 categories: 学习记录:网络协议 excerpt: 传输层、UDP、TCP(可靠传输,流量控制,拥塞控制&#xf…

如何使用 NFTScan NFT API 在 zkSync 网络上开发 Web3 应用

zkSync 是由 Matter Labs 创建的,是一个以用户为中心的 zk rollup 平台,它是以太坊的第 2 层扩展解决方案,使用 zk-rollups 作为扩展技术,与 optimistic rollups 一样,zk-rollups 将会汇总以太坊主网上的交易并将交易证…

基于CSP的运动想象EEG分类任务实战

基于运动想象的公开数据集:Data set IVa (BCI Competition III)1 数据描述参考前文:https://blog.csdn.net/qq_43811536/article/details/134224005?spm1001.2014.3001.5501 EEG 信号时频空域分析参考前文:https://blog.csdn.net/qq_4381153…

基于PHP语言的会员系统搭建(Docker版)

1、操作系统 准备: ubuntu22机器 基础:docker:【精选】Docker微服务-基础_v2/_catalog-CSDN博客 2、安装Docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/…

java项目之公廉租房维保系统(ssm框架)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的公廉租房维保系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 一、业主管理功能 该部分内容提…

【应用前沿】360QPaaS 精彩亮相首届中国航空制造设备博览会 | 数智航空

近日,首届“中国航空制造设备博览会”(CAEE2023)在宁波国际会展中心顺利召开,本届大会以“数智产融 开放发展”为主题,以“新技术、新产品、新服务、新企业”为定位,以特色化、专业化、品牌化、高端化为方向…

[MySQL] MySQL库的基础操作

文章目录 一、数据库的创建 1、1 库的创建 1、2 字符集与校验规则 1、2、1 查看字符集与校验规则 1、2、2 字符集与校验规则的设置 1、2、3 校验规则对数据库的影响 二、数据库的操作 2、1 查看数据库 2、2 删除数据库 2、3 修该数据库 2、4 数据库删除和备份 2、5 显示创建语…

覆盖13个行业,数据分类分级标准汇编更新啦!(附下载)

2016年11月,《网络安全法》明确将“数据分类”作为网络安全保护法定义务之一。 2021年9月,《数据安全法》再次具体确立了“数据分类分级保护制度”及其基本原则。 2021年11月,《个人信息保护法》、《网络数据安全管理条例(征求意见稿)》相继出…

Linux开发工具之编译器gcc/g++

文章目录 1.查看版本2.程序的翻译3.gcc指令3.1gcc hello.c -o hello3.2gcc -E hello.c -o hello.i3.3gcc -S hello.c -o hello.s3.4gcc -c hello.c -o hello.o3.5gcc hello.o -o hello 4.动静态库[详讲链接阶段]4.1初步认识4.2动态链接4.3静态链接 1.查看版本 gcc -v. 2.程序…

Bean作用域

从笔者之前的博客,我们可以看出 Spring 是⽤来读取和存储 Bean,因此在 Spring 中 Bean 是最核⼼的操作 资源,所以接下来我们深⼊学习⼀下 Bean 对象:Bean作用域! 限定程序中变量的可用范围叫做作用域!或者…

Maven依赖包冲突的两种排查和解决方案

1、识别冲突 观察错误消息:Maven在构建过程或者是项目启动过程中,大概率会输出关于版本冲突的警告或错误消息。当然也有小概率是在运行到指定代码时才会产生的包冲突导致异常报错。 使用mvn dependency:tree命令:这个命令可以展示项目中的所…

Adobe Illustrator 2021 下载及安装教程

目录 下载地址: 安装教程: 下载地址: Adobe Illustrator 2021安装包 链接:https://pan.baidu.com/s/1UIzjbS5pRuL7Zpt9RrU5lQ 提取码:lxwj 安装教程: 1、下载压缩包,解压文件 2、双击Set_up.exe&#…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前,结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等,在研发全流程中,已经沉淀了对应的质量保障的实践经验,并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…