使用 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 不起作用