【问题标题】:Plotting month year as x ticks in matplotlib在 matplotlib 中将月份年份绘制为 x 刻度
【发布时间】:2019-10-15 05:24:41
【问题描述】:

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

例如,如果用户输入 5 作为月份,2019 作为年份,我想将第一个 xtick 设为 5/2018,第二个 xtick 设为 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 不是很熟悉,所以如果我能得到一些关于如何解决这个问题的指示会很有帮助。

【问题讨论】:

标签: python datetime matplotlib


【解决方案1】:

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

代码如下:

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 会更容易。

享受吧!

【讨论】:

  • 谢谢你,这真的很有帮助!
  • 我有一个小问题,我复制了你的代码,但为什么没有弹出情节?
  • 嗨!这可能与您当前的绘图配置有关。根据您是否启用了交互模式,是否正在绘制“聚合”以不显示您的图,或一系列其他原因,您的图可能不会显示。简单修复:如果您使用解释器,请尝试输入 fig,或使用 plt.show()
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多