我有每日数据。如何将刻度线限制在几个月内?

时间:2019-12-11 16:28:11

标签: python datetime seaborn heatmap

我有一个数据框,其中包含一年日期的一列和两列数据。我使用日期作为y轴创建数据的热图。如何将y轴刻度限制在几个月内?我认为“ January”可以出现在代表每月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'])

enter image description here

2)使用matplotlib.dates中的MonthLocator(作为“ mdates”)。我无法使它正常工作。这样就不会产生y轴标签。

ax = sns.heatmap(data=df[['a','b']], yticklabels=df['Date'])
ax.yaxis.set_major_locator(mdates.MonthLocator())

enter image description here

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

enter image description here

4)这里没有示例代码。我尝试定位“日期”为1的日期。这不是问题。我只是不知道如何创建适当间隔不均的刻度线来分配它们。

1 个答案:

答案 0 :(得分:2)

我猜这里唯一干净的解决方案是使用matplotlib并格式化轴。为此,将日期转换为数字,并将图像的范围设置为日期值的范围。 (确切地说,也可以添加半天,这样一天就在每个像素的中间)。假设日期(因此像素)之间的距离相等。

import numpy as np
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

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)]})


x = np.arange(len(df.columns[1:]))
y = mdates.date2num(df['Date'].values)
z = df[["a", "b"]].values

dy = y[1]-y[0]
extent = [-0.5, len(x)-0.5, y[0]-dy, y[-1]+dy]

fig, ax = plt.subplots()
im = ax.imshow(z, aspect="auto", extent=extent)
ax.yaxis_date()
ax.invert_yaxis()
ax.set(xticks=x, xticklabels=df.columns[1:])
fig.colorbar(im)

plt.show()

enter image description here

现在,您还可以毫无问题地使用matplotlib日期定位器和格式化程序