我有一个布尔时间序列,我想用它来确定应该着色的图的部分。
目前我有:
ax1.fill_between(data.index, r_min, r_max, where=data['USREC']==True, alpha=0.2)
其中, r_min 和 r_max 只是y轴的最小值和最大值。
但是fill_between并没有一直填充到情节的顶部和底部,因为我想改用 axvspan()。
有没有简单的方法可以做到这一点,因为axvspan只需要坐标?因此,我能想到的唯一方法是将所有彼此相邻的日期分组并为True,然后取这些日期的第一个和最后一个并将它们传递给axvspan。
谢谢
答案 0 :(得分:4)
如果您愿意,仍然可以使用fill_between
。但是,不是在数据坐标中指定y坐标(它不是先验清楚,它们需要多大),而是可以在轴坐标中指定它们。这可以使用变换来实现,其中x部分在数据坐标中,y部分在轴坐标中。 xaxis变换就是这样一种变换。 (这并不奇怪,因为xaxis总是独立于ycoorinates。)所以
ax.fill_between(data.index, 0,1, where=data['USREC'], transform=ax.get_xaxis_transform())
可以胜任。
这是一个完整的例子:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(0)
x = np.linspace(0,100,350)
y = np.cumsum(np.random.normal(size=len(x)))
bo = np.zeros(len(y))
bo[y>5] = 1
fig, ax = plt.subplots()
ax.fill_between(x, 0, 1, where=bo, alpha=0.4, transform=ax.get_xaxis_transform())
plt.plot(x,y)
plt.show()