Search code examples
pandasmatplotlibplotstacked-chart

Visualize marker column in a stacked matplotlib plot


I want to create a stacked plot with an additional linestyle plot like this:

df = pd.DataFrame(data)
df = df[['seconds', 'marker', 'data1', 'data2', 'data3']]
ax = df.set_index('seconds').plot(kind='bar', stacked=True, alpha=set_alpha)
ax.xaxis.set_major_locator(plt.MaxNLocator(5))
plt.plot(df.index, df['data1'], linestyle='solid', color='blue', alpha=0.4, label='data1')
plt.show()

Example data:

seconds,marker,data1,data2,data3
00001,A,3,3,0,42,0
00002,B,3,3,0,34556,0
00003,C,3,3,0,42,0
00004,A,3,3,0,1833,0
00004,B,3,3,0,6569,0
00005,C,3,3,0,2454,0
00006,C,3,3,0,3256,0
00007,C,3,3,0,5423,0
00008,A,3,3,0,569,0

How can I visualize the different marker in the second column? If possible, maybe with a visual connection between two marker states (B-A, B=start, A=end).


Solution

  • Thanks to @pasnik I found one solution:

    dfmarkA=df.loc[df['marker']=='A']
    dfmarkB=df.loc[df['marker']=='B']
    dfmarkC=df.loc[df['marker']=='C']
    
    dfmarkA['marker'] = dfmarkA['marker'].map({'A': scale * 1})
    dfmarkB['marker'] = dfmarkB['marker'].map({'B': scale * 2})
    dfmarkC['marker'] = dfmarkC['marker'].map({'C': scale * 3})
    
    
    plt.plot(dfmarkA.index, dfmarkA['scale'], marker='*', linestyle='None', color='blue')
    ...
    

    Currently there is a warning and scale is a fix value, so still room for improvement.

    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead