有几种方法可以做到这一点。
代码如下:
import matplotlib.pyplot as plt
import numpy as np
import datetime
import click
def make_data():
Nrain = 20
start = datetime.date(2017,12,1)
end = datetime.date(2019,1,1)
period = (end-start).days/365
rainfall = 30*np.random.rand(Nrain) + 120*(1+np.cos(Nrain/period))
delta = (end-start)/Nrain
dates = [start + i*delta for i in range(Nrain)]
return rainfall, dates
def plot_rain(rainfall):
fig = plt.figure(figsize=(8,6))
ax = fig.subplots()
ax.plot(rainfall)
return fig
def xticks_auto(ax,dates,Nticks=10):
delta = (dates[-1]-dates[0])/Nticks
tick_dates = [dates[0] + i*delta for i in range(Nticks)]
x_ticks = ['{}/{}'.format(d.month,d.year) for d in tick_dates]
ax.set_xticks([i*len(dates)/Nticks for i in range(Nticks)])
ax.set_xticklabels(x_ticks)
def xticks_pres(ax,dates,Nticks=10):
start_m = click.prompt('Start month', type=int)
start_y = click.prompt('Start year', type=int)
end_m = click.prompt('End month', type=int)
end_y = click.prompt('End year', type=int)
start = datetime.date(start_y,start_m,1)
end = datetime.date(end_y,end_m,1)
Nticks = 10
delta = (end-start)/Nticks
tick_dates = [start + i*delta for i in range(Nticks)]
x_ticks = ['{}/{}'.format(d.month,d.year) for d in tick_dates]
ax.set_xticks([i*len(dates)/Nticks for i in range(Nticks)])
ax.set_xticklabels(x_ticks)
make_data() 制作了一些伪降雨数据。如果我们先运行一些简单的代码:
>>> rainfall, dates = make_data()
>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
这会生成一些数据并将其绘制成图形:
请注意,x 值只是数据点的索引。如果我们运行xticks_pres,可以指定开始日期和结束日期,xticks 将被更新:
>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
>>> xticks_pres(ax,dates)
Start month:
5
Start year:
2011
End month:
6
End year:
2015
为了能够添加日期点,您需要日期集的长度或降雨集的长度。如果您设置了日期,您不妨使用自动填充:
>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
>>> xticks_auto(ax,dates,5)
在最后一次代码执行中,我覆盖了 Nticks 的默认值 10,指定我只需要 5 个滴答声。
我认为有了这些 sn-ps,您应该能够做您想做的事情。如果你真的想使用用户输入,你可以,但在大多数情况下,简单地自动摇动 xticks 会更容易。
享受吧!