在matplotlib中以x刻度绘制月份年份

时间:2019-10-15 05:24:41

标签: python datetime matplotlib

我有一个需要一个月和一年的函数,我想将绘图的xticks设置为输入的月和年。

例如,如果用户输入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 :(得分:0)

有两种方法可以做到这一点。

请参见下面的一些代码:

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,则可以指定开始日期和结束日期,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

enter image description here

要添加日期点,您需要日期集的长度或降雨集的长度。如果设置了日期,则最好使用自动填充:

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

enter image description here

在最后的代码执行中,我覆盖了Nticks的默认值10,指定我只想要5个刻度。

我认为使用这些摘录,您应该能够实现想要实现的目标。如果您确实想使用用户输入,则可以,但是在大多数情况下,简单地自动摇动xticks会更容易。

享受!