You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为calmap日历热力图创建自定义颜色图例?

为calmap日历热力图添加自定义图例

场景说明

我有一个包含2022年全年活动水平数值的DataFrame,使用calmap库绘制了类似GitHub贡献图的日历热力图:

  • x轴为月份,y轴为日期
  • 方块颜色表示活动水平高低(蓝色代表高数值,红色代表低数值)

现有绘图代码如下:

import pandas as pd
import calmap

# 假设df_activities已加载完成
days = df_activities.loc[:,'Date'].to_numpy()  
events = pd.Series(df_activities.loc[:, 'ActivityLevel'].to_numpy(), index=days)

# 绘制热力图
calmap.yearplot(events, cmap='RdYlBu', linewidth=0.3)
calmap.plt.title("2022年活动数据热力图")

df_activities的部分数据示例:

df_activites[['Date', 'ActivityLevel']].head(10)

    Date            ActivityLevel
0   2022-01-01      5.733
1   2022-01-02      1.317
2   2022-01-03      5.150
3   2022-01-04      7.283
4   2022-01-05      6.450
5   2022-01-06      8.933
6   2022-01-07      7.333
7   2022-01-08      8.483
8   2022-01-09      6.417
9   2022-01-10      5.517

需求

需要添加自定义图例,明确标注蓝色对应高活动水平、红色对应低活动水平,可参考简化版的色块图例样式。


解决方案

calmap基于matplotlib实现,因此可以直接借助matplotlib的工具创建自定义图例,以下提供两种实用方式:

方式一:离散色块图例(类似示例样式)

通过创建颜色补丁(Patch)生成离散区间的图例,清晰展示高、中、低三个档位的颜色对应关系:

import pandas as pd
import calmap
from matplotlib.patches import Patch
from matplotlib.pyplot import legend

# 加载数据并生成时间序列
days = df_activities.loc[:,'Date'].to_numpy()  
events = pd.Series(df_activities.loc[:, 'ActivityLevel'].to_numpy(), index=days)

# 绘制热力图
fig, ax = calmap.yearplot(events, cmap='RdYlBu', linewidth=0.3)
calmap.plt.title("2022年活动数据热力图")

# 获取颜色映射和数据极值
cmap = calmap.plt.get_cmap('RdYlBu')
min_activity = events.min()
max_activity = events.max()
mid_activity = (min_activity + max_activity) / 2

# 创建图例元素
legend_items = [
    Patch(facecolor=cmap(1.0), label=f'高活动水平 ({max_activity:.1f})'),
    Patch(facecolor=cmap(0.5), label=f'中等活动水平 ({mid_activity:.1f})'),
    Patch(facecolor=cmap(0.0), label=f'低活动水平 ({min_activity:.1f})')
]

# 添加图例到图表右侧,避免遮挡热力图
legend(handles=legend_items, loc='upper right', bbox_to_anchor=(1.3, 1))

calmap.plt.tight_layout()
calmap.plt.show()

方式二:连续颜色条图例(更直观展示数值梯度)

如果需要体现活动水平的连续变化,可添加垂直颜色条,精准对应颜色与数值的关系:

import pandas as pd
import calmap
from matplotlib import colorbar

# 加载数据并生成时间序列
days = df_activities.loc[:,'Date'].to_numpy()  
events = pd.Series(df_activities.loc[:, 'ActivityLevel'].to_numpy(), index=days)

# 绘制热力图并获取画布和轴对象
fig, ax = calmap.yearplot(events, cmap='RdYlBu', linewidth=0.3)
calmap.plt.title("2022年活动数据热力图")

# 创建颜色条的轴位置([左, 下, 宽, 高],可根据图表调整)
colorbar_ax = fig.add_axes([0.92, 0.2, 0.02, 0.6])

# 生成颜色条
norm = calmap.plt.Normalize(vmin=events.min(), vmax=events.max())
cb = colorbar.ColorbarBase(colorbar_ax, cmap='RdYlBu', norm=norm, orientation='vertical')
cb.set_label('活动水平')

calmap.plt.tight_layout()
calmap.plt.show()

内容的提问来源于stack exchange,提问作者pinguino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:53:26