Python Matplotlib:如何设置x轴刻度分辨率?

时间:2018-04-26 03:03:39

标签: python matplotlib

我一直在谷歌搜索答案一段时间,但无法找到一个简单的解决方案,所以我在这里发布我的问题,冒着提出重复问题的风险。

假设我正在绘制如下图所示的时间序列图。

  • 如何将主要/次要蜱的距离设置为每1/3/6/12 ...月?
  • 如何设置主要/次要刻度的分辨率,使得刻度总数为x?

任何帮助将不胜感激。

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')

enter image description here

1 个答案:

答案 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)

enter image description here