使用 matplotlib 在时间序列中自定义日期范围(x 轴)

Posted

技术标签:

【中文标题】使用 matplotlib 在时间序列中自定义日期范围(x 轴)【英文标题】:Custom date range (x-axis) in time series with matplotlib 【发布时间】:2013-08-01 23:41:35 【问题描述】:

我绘制时间序列的代码是这样的:

def plot_series(x, y):
    fig, ax = plt.subplots()
    ax.plot_date(x, y, fmt='g--') # x = array of dates, y = array of numbers

    fig.autofmt_xdate()
    plt.grid(True)
    plt.show()

我有几千个数据点,因此 matplotlib 创建了 3 个月的 x 轴范围。这是我现在的时间序列的样子:

但是,我想要一个每周/每两周的系列。如何更改 matplotlib 计算 x 轴日期范围的方式,并且由于我有将近 1 年的数据,我如何确保所有数据都很好地适合单个图表?

【问题讨论】:

ax.set_xlim([min_time, max_time]) 这样简单的东西会起作用还是你需要更自动化的东西? 这将限制最小值和最大值。我想要的是更“放大”的图表。因此,我想要 1 周或 2 周的间隔,而不是 3 个月的间隔。 嗯。如果我在关注你,你想将你的数据读入 pandas DataFrame,然后重新采样:pandas.pydata.org/pandas-docs/dev/10min.html#time-series 【参考方案1】:

要更改 x 轴上刻度线的频率,您必须设置其定位器。

要为每周的每个星期一设置刻度线,您可以使用 matplotlib 的dates 模块提供的WeekdayLocator

(未经测试的代码)

from matplotlib.dates import WeekdayLocator

def plot_series(x, y):
    fig, ax = plt.subplots()
    ax.plot_date(x, y, fmt='g--') # x = array of dates, y = array of numbers        

    fig.autofmt_xdate()

    # For tickmarks and ticklabels every week
    ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO))

    # For tickmarks and ticklabels every other week
    #ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO, interval=2))

    plt.grid(True)
    plt.show()

仅使用一个绘图时,x 轴上可能会有点拥挤,因为这会生成大约 52 个刻度。

一种可能的解决方法是为每 n 周(例如每 4 周)设置刻度标签,并且每周只设置刻度标记(即没有刻度标签):

from matplotlib.dates import WeekdayLocator

def plot_series(x, y):
    fig, ax = plt.subplots()
    ax.plot_date(x, y, fmt='g--') # x = array of dates, y = array of numbers        

    fig.autofmt_xdate()

    # For tickmarks and ticklabels every fourth week
    ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO, interval=4))

    # For tickmarks (no ticklabel) every week
    ax.xaxis.set_minor_locator(WeekdayLocator(byweekday=MO))

    # Grid for both major and minor ticks
    plt.grid(True, which='both')
    plt.show()

【讨论】:

ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))一起,这就像魅力!

以上是关于使用 matplotlib 在时间序列中自定义日期范围(x 轴)的主要内容,如果未能解决你的问题,请参考以下文章

如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用

gridPro 中自定义日期选择器组件的值始终为空

我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?

如何在 Rails 中自定义活动管理视图?

如何在 django 中自定义数据库连接设置的时区?

在ASP(VB)中自定义日期格式的函数