【问题标题】:Matplotlib axvspan shading for pandas DataFrame subplots based on one of the columns基于其中一列的 Pandas DataFrame 子图的 Matplotlib axvspan 着色
【发布时间】:2013-12-26 22:35:42
【问题描述】:

根据 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)

结果如下图:

理想情况下,我想要一个只有Value1Value2 的子图,两个图都使用axvspan 着色,其中OnOnOff 中带有1.0 的值)被着色,Off没有阴影。

【问题讨论】:

    标签: python matplotlib pandas time-series


    【解决方案1】:

    您已经做好了这方面的准备。不过,我认为您需要直接与 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()
    

    这给了我:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 2013-01-15
      • 2017-10-28
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2021-12-30
      • 2013-12-24
      相关资源
      最近更新 更多