【问题标题】:Background shape of plot based on variable基于变量的绘图背景形状
【发布时间】:2019-03-12 07:31:06
【问题描述】:

我有一个 pandas 数据框,它有几列数据和一列编码感兴趣进程的状态(非连续整数)。

我不想将状态列绘制为一条线,而是使用它为绘图的背景添加阴影,例如如下:

示例数据框:

df = pd.DataFrame(
{
    "y": [x * x / 100 for x in range(10)],
    "state": [0 if x < 5 else 1 for x in range(10)],
})
    y   state
0   0.00    0
1   0.01    0
2   0.04    0
3   0.09    0
4   0.16    0
5   0.25    1
6   0.36    1
7   0.49    1
8   0.64    1
9   0.81    1

想要的情节(请注意,状态是作为一条线包含在内的,在最后的图片中我当然会省略它):

【问题讨论】:

    标签: python pandas dataframe matplotlib


    【解决方案1】:

    您可以找到state 为常量的块,然后使用axvspan 为这些块填充不同的颜色:

    fig, ax = plt.subplots(1)
    ax.set_ylim(0,1)
    
    df[['y']].plot(ax=ax)
    
    x = df.loc[df['state'] != df['state'].shift(1), 'state'].reset_index()
    x['next_index'] = x['index'].shift(-1).fillna(df.index.max())
    
    for i in x.index:
        c = 'blue' if (x.at[i, 'state']==1) else 'red'
        xa = x.at[i, 'index']
        xb = x.at[i, 'next_index']
        ax.axvspan(xa, xb, alpha=0.15, color=c)
    

    输出:

    【讨论】:

    • 谢谢。这基本上有效。虽然我稍微修改了一下。我使用 ax.axvspan() 而不是 ax.fill_between(),因为它涵盖了整个 y 范围,而不是仅低于 y1。此外,我最终使用了另一种方法来生成 x DataFrame。
    • 哦,是的,我认为你是对的,axvspan() 实际上更好!让我在我的回答中更新一下
    • 顺便说一下,x 的计算你做了什么改变?
    • 我把完整的例子放在这里:ColorPlot.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2016-08-05
    相关资源
    最近更新 更多