Составление графика месяца года как x отметок в matplotlib - PullRequest
0 голосов
/ 15 октября 2019

У меня есть функция, которая принимает месяц и год, и я хочу установить символы графика для введенного месяца и года.

Например, если пользователь вводит 5 как месяц и 2019 какгод я хочу сделать первый xtick 5/2018, второй 6/2018 и так далее. Если он достигнет 12/2018, следующий тик должен быть 1 / 2019.

Мой код пока:

def cityPlot(self, year, month):
    myDates = [datetime(int(year), month, 1]
    plt.xticks(np.arange(1,17), myDates.split)

Я не очень знаком с matplotlib, поэтому было бы полезно, еслиЯ мог бы получить некоторые советы о том, как решить эту проблему.

1 Ответ

0 голосов
/ 15 октября 2019

Есть несколько способов сделать это.

См. Ниже некоторый код:

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

Обратите внимание, что значения 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

БытьДля добавления точек даты вам понадобится либо длина набора дат, либо длина набора осадков. Если у вас установлены даты, вы также можете использовать автоматическое заполнение:

>>> fig = plot_rain(rainfall)
>>> ax = fig.axes[0]
>>> xticks_auto(ax,dates,5)

enter image description here

В этом последнем выполнении кода я переопределил значения по умолчаниюзначение 10 для Nticks, указывающее, что я хочу только 5 тиков.

Я думаю, что с этими фрагментами вы сможете делать то, что хотите достичь. Если вы действительно хотите использовать пользовательский ввод, вы можете это сделать, но в большинстве случаев проще просто автоматически перемешивать значки.

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...