我一直在谷歌搜索答案一段时间,但无法找到一个简单的解决方案,所以我在这里发布我的问题,冒着提出重复问题的风险。
假设我正在绘制如下图所示的时间序列图。
任何帮助将不胜感激。
t = np.arange(np.datetime64('2005-02-25'), np.datetime64('2019-02-25'), np.timedelta64(1,'D'))
df = pd.DataFrame(np.random.randn(len(t), 3),columns=['A','B','C']).cumsum()
df['Date'] = t
df=df.set_index('Date')
ax=df.plot(figsize=(16,8))
ax.grid(which='both')
答案 0 :(得分:0)
你的第二个问题(特定的xticks总数)很容易解决:
start = t[0].astype(int)
stop = t[-1].astype(int)
N = 7
ax.xaxis.set_ticks(np.linspace(start, stop, N).astype(int))
ax.xaxis.set_ticklabels(np.linspace(start, stop, N).astype('datetime64[D]'))
第一个可以用同样的方法解决,虽然这不是很容易阅读,因为在不同的地方需要不同的数据类型......
然而,主要思想是使用列表推导来创建主要刻度的第一个月 - 日期列表,以及例如次要标记的第一个每三个月日期:
xl = ax.get_xlim()
import datetime as DT
start = t[0].astype(DT.date)
stop = t[-1].astype(DT.date)
ax.xaxis.set_ticks([np.datetime64(DT.date(y, 1, 1)).astype(int) for y in range(start.year, stop.year+1)])
ax.xaxis.set_ticks(np.array([[np.datetime64(DT.date(y, m, 1)).astype(int) for m in range(1,13,3)] for y in range(start.year-1, stop.year+1)]).flatten(), minor = True)
ax.xaxis.grid(which='minor', ls=':')
ax.set_xlim(xl)