使用Pandas绘制时间序列图时设置边距

3

我有以下代码用于生成时间序列图

import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
series = pd.Series([np.sin(ii*np.pi) for ii in range(30)],
                   index=pd.date_range(start='2019-01-01', end='2019-12-31',
                                       periods=30))
series.plot(ax=ax)

enter image description here

我希望设置x和y的自动限制,我尝试使用ax.margins(),但似乎没有起作用:

ax.margins(y=0.1, x=0.05)
# even with
# ax.margins(y=0.1, x=5)

enter image description here

我需要的是一种自动方法,类似于padding=0.1(图形周围10%的空白)。
2个回答

4

在轴包含日期时,Pandas和Matplotlib在协作中经常出现混淆。由于某种原因,在这种情况下,ax.margins与x轴不像预期的那样起作用。

这里有一个解决方法,明确移动xlims,似乎可以完成工作:

xmargins = 0.05
ymargins = 0.1
ax.margins(y=ymargins)
x0, x1 = plt.xlim()
plt.xlim(x0-xmargins*(x1-x0), x1+xmargins*(x1-x0))

与此相反,您还可以直接使用matplotlib的绘图功能,它会将边距应用于日期轴。

ax.plot(series.index, series)
ax.margins(y=0.1, x=0.05)

提示: 这篇文章 提到了将use_sticky_edges设置为False,并在设置边距后调用autoscale_view,但在这里似乎也不起作用。

ax.use_sticky_edges = False
ax.autoscale_view(scaley=True, scalex=True)

1
你可以使用 ax.set_xlimax.set_ylim 分别设置图表的 x 和 y 轴限制。
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
series = pd.Series([np.sin(ii*np.pi) for ii in range(30)],
                   index=pd.date_range(start='2019-01-01', end='2019-12-31',
                                       periods=30))

# set xlim to be a between certain dates
ax.set_xlim((pd.to_datetime('2019-01-01'), pd.to_datetime('2019-01-31'))

# set ylim to be between certain values
ax.set_ylim((-0.5, 0.5))

series.plot(ax=ax)


我所寻找的是一种自动方法,例如padding=0.1(图表周围10%的空白)。 - Daniel Lima
看起来你的解决方案对于那个问题是有效的(至少从y轴上看是这样,x轴似乎没有工作)。 - hkennyv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接