seaborn 热图轴中的日期

Date in seaborn heatmap axis

我正在绘制一个与病例数、年龄范围和日期相关的热图。但是我无法将 x 轴标签减少到 %d-%b(例如 15-Dec)。我怎样才能改变这个?我的数据在 Pastebin 中。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

df_general = pd.read_csv('df_general.csv')
df_general['Date'] = pd.to_datetime(df_general['Date'])

fig = plt.figure(figsize = (15,5))

y_axis_labels = ['0 to 1', '1 to 9', '10 to 19', '20 to 29', '30 to 39',
                '40 to 49', '50 to 59', '60 to 69', '70 to 79', '80 to 89',
                '> 90']

covid_matrix = df_general.pivot('FAIXA_ETARIA', 'Date', 'count')

sns.heatmap(covid_matrix, xticklabels = 30, yticklabels = y_axis_labels, cmap='coolwarm')
#x-axis ticklabels between 30 dates

当我定义一个带有特定标签的列表时,添加 m e 替换 xticklabels 值,图表变得更糟:

m = ('01-Jan', '01-Fev', '01-Mar', '01-Apr', '01-May', '01-Jun', '01-Jul', '01-Ago', '01-Sep', '01-Oct', '01-Nov', '01-Dec')

sns.heatmap(covid_matrix, xticklabels = m, yticklabels = y_axis_labels, cmap='coolwarm')
#x-axis ticklabels with m value

您不能简单地将 x-axis 格式化为日期,因为 heatmap 只会显示您的 covid_matrix 中的那些日期;缺少日期的热图中不会有间隙(例如 2020-13-01 和 2020-02-02 之间的日期)。

最简单的方法是从用于 x 轴的格式化程序字典中获取所选刻度位置的值(在您的示例中每 30 列)并根据需要重新格式化它们:

ax = sns.heatmap(covid_matrix, xticklabels = 30, yticklabels = y_axis_labels, cmap='coolwarm')
ax.xaxis.set_ticklabels([pd.to_datetime(value).strftime('%d-%b') for value in ax.xaxis.get_major_formatter().func.args[0].values()])

或者为所选列获取列 header 值(floor 到 int,因为热图中的标签位于 之间 列值的位置):

ax.xaxis.set_ticklabels([d.strftime('%d-%b') for d in covid_matrix.columns[ax.get_xticks().astype(int)]])