2013-12-09 53 views
1

根据DataFrame中的某一列对pandas子图进行阴影处理的最优雅方式是什么?Matplotlib axvspan为大熊猫着色基于列之一的DataFrame subplots

一个简单的例子:

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其中被阴影On(中的值为1.0)为阴影且Off不是阴影。

回答

6

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

如果您设置数据框像这样(你有什么话):

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