如何将axvfill与布尔系列一起使用

时间:2017-04-05 14:05:53

标签: python matplotlib

我有一个布尔时间序列,我想用它来确定应该着色的图的部分。

目前我有:

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。

谢谢

1 个答案:

答案 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()

enter image description here