繁体   English   中英

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

[英]Python Matplotlib: How to set x-axis tick resolution?

我一直在寻找答案已有一段时间,但找不到一个简单的解决方案,因此我在此处发布问题可能会提出重复的问题。

假设我正在绘制一个时序图,如下图所示。

  • 如何将主要/次要刻度线的距离设置为每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')

在此处输入图片说明

您的第二个问题(一定数量的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)

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM