我有一个Pandas Dataframe,它有几列数据和一列,该列编码感兴趣的过程的状态(非连续整数).
与其将状态列绘制为一条线,我不希望使用它为绘制的背景添加阴影,例如如下:
示例数据框:
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
所需的绘图(请注意,状态包括在一条线中以使点穿过,在最后一张图中,我当然会忽略它):
最佳答案
您可以找到状态为常数的块,然后使用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)
输出: