【发布时间】:2019-12-12 02:09:42
【问题描述】:
我有一个数据框,其中一列包含一年的每日日期和两列数据。我正在创建数据的热图,使用日期作为 y 轴。如何将 y 轴刻度限制为仅几个月?我同意“一月”出现在代表本月 1 日的行或代表月中的行。出于可扩展性的目的,“日期”列将始终按时间顺序排列,并且始终具有恒定增量,但不一定像我的示例中那样恰好是 1 天。
df = pd.DataFrame({'Date':[dt.date(2019,1,1) + dt.timedelta(days=x) for x in range(365)],
'a':[x%5 for x in range(365)], 'b':[x%3 for x in range(365)]})
print(df.head())
Date a b
0 2019-01-01 0 0
1 2019-01-02 1 1
2 2019-01-03 2 2
3 2019-01-04 3 0
4 2019-01-05 4 1
1) 标准热图代码。这会导致 y 轴混乱。
ax = sns.heatmap(data=df[['a','b']], yticklabels=df['Date'])
2) 使用 matplotlib.dates 中的 MonthLocator(作为 'mdates')。我无法让它工作。这会导致没有 y 轴标签。
ax = sns.heatmap(data=df[['a','b']], yticklabels=df['Date'])
ax.yaxis.set_major_locator(mdates.MonthLocator())
3) 使用花哨的数学。这不能说明天数不相等的月份。
ax = sns.heatmap(data=df[['a','b']])
ax.set_yticks(range(0,df.shape[0]-1,df.shape[0]//12)) #13 evenly spaced tick marks
ax.set_yticklabels(df['Date'].apply(lambda x: x.strftime('%B %d %Y')).iloc[range(0,df.shape[0]-1,df.shape[0]//12)]) #Select dates matching tick marks
4) 这里没有示例代码。我尝试找到“日”为 1 的日期。这不是问题。我只是不知道如何创建适当的不均匀间隔的刻度来分配它们。
【问题讨论】:
标签: python datetime seaborn heatmap