Есть несколько способов сделать это.
См. Ниже некоторый код:
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]
Это генерирует некоторые данные и выводит их на график:
![enter image description here](https://i.stack.imgur.com/OIROv.png)
Обратите внимание, что значения x - это просто индексы точек данных. Если мы запустим xticks_pres
, можно назначить дату начала и дату окончания, и символы будут обновлены:
>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
>>> xticks_pres(ax,dates)
Start month:
5
Start year:
2011
End month:
6
End year:
2015
![enter image description here](https://i.stack.imgur.com/8RBUo.png)
БытьДля добавления точек даты вам понадобится либо длина набора дат, либо длина набора осадков. Если у вас установлены даты, вы также можете использовать автоматическое заполнение:
>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
>>> xticks_auto(ax,dates,5)
![enter image description here](https://i.stack.imgur.com/W495g.png)
В этом последнем выполнении кода я переопределил значения по умолчаниюзначение 10 для Nticks, указывающее, что я хочу только 5 тиков.
Я думаю, что с этими фрагментами вы сможете делать то, что хотите достичь. Если вы действительно хотите использовать пользовательский ввод, вы можете это сделать, но в большинстве случаев проще просто автоматически перемешивать значки.
Наслаждайтесь!