[英]Python Matplotlib: How to set x-axis tick resolution?
我一直在寻找答案已有一段时间,但找不到一个简单的解决方案,因此我在此处发布问题可能会提出重复的问题。
假设我正在绘制一个时序图,如下图所示。
任何帮助将不胜感激。
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.