数据可视化-16. 日历图

目录

[1. 日历图的概念](#1. 日历图的概念)

[2. 日历图的适用场景](#2. 日历图的适用场景)

[2.1 事件或活动的频率分析](#2.1 事件或活动的频率分析)

[2.2 数据的时间周期性分析](#2.2 数据的时间周期性分析)

[2.3 异常值检测](#2.3 异常值检测)

[2.4 绩效监控](#2.4 绩效监控)

[3. 日历图的缺陷](#3. 日历图的缺陷)

[3.1 粒度受限于天数](#3.1 粒度受限于天数)

[3.2 数据密度过高时候难以解读](#3.2 数据密度过高时候难以解读)

[3.3 难以比较多个数据集](#3.3 难以比较多个数据集)

[3.4 周期性较长的数据不易展示](#3.4 周期性较长的数据不易展示)

[4. 日历图的代码实现](#4. 日历图的代码实现)

[4.1 基础日历图的代码实现](#4.1 基础日历图的代码实现)

[4.2 基础日历图的效果展示](#4.2 基础日历图的效果展示)

[4.3 聚合日历图的代码实现](#4.3 聚合日历图的代码实现)

[4.4 聚合日历图的效果展示](#4.4 聚合日历图的效果展示)


1. 日历图的概念

在数据分析中,日历图 (Calendar Heatmap/ Calendar Plot)是一种常用的可视化图表,用来展示时间序列数据在日历周期内的分布情况。它按照时间的顺序(通常是以天、周或月为单位)来展示数据,能够直观地揭示时间模式周期性变化

2. 日历图的适用场景

2.1 事件或活动的频率分析

在商业领域展示每天的某种事件发生频率,例如网站访问量、客户订单量、报警次数等。在健康领域记录每天的运动时长、步数或其他健康指标。

2.2 数据的时间周期性分析

确定特定时间段(如某个月、某一年)的模式和趋势,例如流量高峰期或淡季。

2.3 异常值检测

通过颜色对比,快速定位数据的异常点,例如某天的数值特别高或特别低。

2.4 绩效监控

追踪某个指标的日常表现,例如销售额、运动步数、代码提交次数。或者分析设备、服务或系统的资源每日利用率,例如服务器负载或网络带宽。

3. 日历图的缺陷

3.1 粒度受限于天数

日历图通常以天为粒度,不适合展示更细粒度(如小时、分钟)或更粗粒度(如季度、年度)的数据。

3.2 数据密度过高时候难以解读

当数据量非常大时(如分析多年的日数据),日历图可能显得杂乱,难以区分颜色和模式。

3.3 难以比较多个数据集

日历图主要关注单一数据集的时间分布,多数据集的对比可能显得困难。

3.4 周期性较长的数据不易展示

如果数据的周期性超出一年(如多年的数据),日历图可能无法有效展示全局趋势。

4. 日历图的代码实现

4.1 基础日历图的代码实现

python 复制代码
import plotly.express as px
import pandas as pd
import numpy as np
import dash
from dash import html, dcc
import dash_bootstrap_components as dbc

def create_detailed_calendar_heatmap():
    """
    创建一个详细的日历图,细化到每一天的数据
    返回日历图图形对象
    """
    # 生成示例数据
    np.random.seed(42)
    dates = pd.date_range(start="2023-01-01", end="2023-12-31", freq='D')
    values = np.random.randint(0, 100, size=len(dates))

    # 创建数据框
    df = pd.DataFrame({'date': dates, 'value': values})

    # 提取年份和月份
    df['year'] = df['date'].dt.year
    df['month'] = df['date'].dt.month
    df['day'] = df['date'].dt.day

    # 创建透视表
    pivot_table = df.pivot_table(index='month', columns='day', values='value', aggfunc='mean')

    # 创建日历图
    fig = px.imshow(
        pivot_table,
        labels=dict(x="Day", y="Month", color="Value"),
        x=np.arange(1, 32),
        y=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        color_continuous_scale='Viridis'
    )

    # 更新布局
    fig.update_layout(
        title='详细日历图示例',
        xaxis_title='日期',
        yaxis_title='月份',
        template='plotly_white'
    )

    return fig

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([
    html.H3("详细日历图展示", className="text-center mt-4 mb-3"),
    dcc.Graph(figure=create_detailed_calendar_heatmap())
])

if __name__ == "__main__":
    app.run_server(debug=True, port=8051)

4.2 基础日历图的效果展示

4.3 聚合日历图的代码实现

聚合日历图将一段时间内的数据进行汇总,然后以周、月或季度为单位进行展示。这种图表有助于观察数据在不同时间段内的总体趋势,适用于分析季节性变化或长期趋势。

python 复制代码
import plotly.express as px
import pandas as pd
import numpy as np
import dash
from dash import html, dcc
import dash_bootstrap_components as dbc

def create_detailed_calendar_heatmap():
    """
    创建一个详细的日历图
    返回日历图图形对象
    """
    # 生成示例数据
    np.random.seed(42)
    dates = pd.date_range(start="2023-01-01", end="2023-12-31", freq='D')
    values = np.random.randint(0, 100, size=len(dates))
    categories = np.random.choice(['A', 'B', 'C', 'D'], size=len(dates))

    # 创建数据框
    df = pd.DataFrame({'date': dates, 'value': values, 'category': categories})

    # 创建日历图
    fig = px.density_heatmap(
        df, x='date', y='category', z='value',
        nbinsx=12,  # 每个月一个bin
        nbinsy=4,   # 每个类别一个bin
        color_continuous_scale='Viridis'
    )

    # 更新布局
    fig.update_layout(
        title='详细日历图示例',
        xaxis_title='日期',
        yaxis_title='类别',
        template='plotly_white'
    )

    return fig

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

app.layout = html.Div([
    html.H3("详细日历图展示", className="text-center mt-4 mb-3"),
    dcc.Graph(figure=create_detailed_calendar_heatmap())
])

if __name__ == "__main__":
    app.run_server(debug=True, port=8051)

4.4 聚合日历图的效果展示

相关推荐
weixin_307779135 分钟前
Neo4j 数据可视化与洞察获取:原理、技术与实践指南
信息可视化·架构·数据分析·neo4j·etl
Dxy12393102167 分钟前
DrissionPage 性能优化实战指南:让网页自动化效率飞升
运维·爬虫·python·性能优化·自动化
蹦蹦跳跳真可爱58919 分钟前
Python----目标检测(《SSD: Single Shot MultiBox Detector》论文和SSD的原理与网络结构)
人工智能·python·深度学习·神经网络·目标检测·计算机视觉
LeonDL1681 小时前
HALCON 深度学习训练 3D 图像的几种方式优缺点
人工智能·python·深度学习·3d·halcon·halcon训练3d图像·深度学习训练3d图像
慧都小妮子2 小时前
跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用
开发语言·python·api·jxbrowser·chrome 扩展程序
tanyyinyu3 小时前
Python函数参数详解:从位置参数到灵活调用的艺术
运维·开发语言·python
qq_214782613 小时前
mac下通过anaconda安装Python
python·macos·jupyter
junyuz4 小时前
Dify docker内网部署常见问题记录
python·docker
@HNUSTer4 小时前
Python数据可视化科技图表绘制系列教程(一)
python·数据可视化·科技论文·专业制图·科研图表
reasonsummer5 小时前
【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)
python·excel