Matplotlib axvspan着色为pandas DataFrame子图基于其中一列

时间:2013-12-09 17:41:53

标签: python matplotlib pandas time-series

根据DataFrame中的某个列对pandas子图进行着色的最优雅方法是什么?

一个简单的例子:

In [8]:
from random import *
import pandas as pd

randBinList = lambda n: [randint(0,1) for b in range(1,n+1)]
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.DataFrame({'Value1': randn(len(rng)),'Value2': randn(len(rng)),'OnOff': randBinList(len(rng))}, index=rng)
ts.plot(subplots=True)

结果如下:

pandas subplots for axvspan

理想情况下,我想要一个只有Value1Value2的子图,两个图都使用axvspan阴影,其中On1.0的值为OnOff Off)有阴影,{{1}}没有阴影。

1 个答案:

答案 0 :(得分:7)

你的设置非常好。不过,我认为你需要直接与matplotlib进行交互。

如果你设置你的DataFrame(你已经拥有):

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

randBinList = lambda n: [np.random.randint(0,2) for b in range(1,n+1)]
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.DataFrame({
    'Value1': np.random.randn(len(rng)),
    'Value2': np.random.randn(len(rng)),
    'OnOff': randBinList(len(rng))
}, index=rng)

然后,您可以将fill_between命令与where kwarg一起使用:

fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(ts.index, ts['Value1'], 'k-')
ax1.fill_between(ts.index, ts['Value1'], y2=-6, where=ts['OnOff'])

ax2.plot(ts.index, ts['Value2'], 'k-')
ax2.fill_between(ts.index, ts['Value2'], y2=-6, where=ts['OnOff'])
fig.tight_layout()

这给了我: toggle plot