matplotlib 如何为基于日历的热图(calmap)创建自定义颜色图例?

35g0bw71  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(191)

我有一个数据框,其中包含了一整年收集的数值数据,我想把它绘制成一个随时间变化的热图(类似于Github的贡献),其中

  • 月沿着x轴绘制
  • 天沿着y轴绘制
  • 每个方框/数据点的颜色表示高/低数值:在下面的例子中,蓝色代表高数值,红色代表低数值。

我使用的Python库calmap可以从Pandas的时间序列数据中生成一个日历热图。这是我用来创建上面热图的代码。

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("Activity Data across 2022")

其中df_activites的代码片段如下所示:

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而不是seaborn,实现这一点的最佳方法是什么?任何帮助都非常感谢!

它可以是像下面的图例一样简单的东西,其中的颜色/标签被替换为我的数据集。

yjghlzjz

yjghlzjz1#

首先,您可以创建类似于this example的自定义离散色彩Map表。
其次,您可以创建一系列空图来保存图例的标签(假设您已经有了与每种颜色对应的标签列表)。
最后,bbox_to_anchor可用于将图例置于图外。有关此参数的更多详细信息,请参阅this excellent answer
希望有帮助。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import calmap
from matplotlib import colors

# Generating sample data
all_days = pd.date_range('01.01.2022', periods=700, freq='D')
days = np.random.choice(all_days, 500)
events = pd.Series(np.random.randn(len(days)), index=days)

# The colors and labels could be used from elsewhere as long as they are of the same size
cm_colors = ['blue', 'green', 'red']
cm_labels = ['Low', 'Medium', 'High']

cmap = colors.ListedColormap(cm_colors)

fig, ax = plt.subplots(figsize=(10, 3))
calmap.yearplot(events, cmap=cmap, vmin=events.min(), vmax=events.max(), linewidth=0.3, ax=ax)

for i in range(len(cm_colors)):
    ax.plot([],[],c=cmap.colors[i],label=cm_labels[i])

ax.legend(bbox_to_anchor=(1.04,0.5), loc='center left')
plt.title('Activity data across 2022')
fig.tight_layout()

plt.show()

结果是:

此外,calmap.yearplot源代码可以在这里找到。

相关问题