如何为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
相关产品推荐
相关产品推荐

