不同类别的堆积条形图颜色

Stacked bar plot color by a diferent category


我想绘制一个图,其中按 unit_id 打开的楼层显示 RFS,但我希望 unit_id 的颜色由年份定义。到目前为止,我让它适用于减少的数据集,但我认为很难扩展代码。
我要做的是,首先我确定每个单元在其楼层的顺序,所以我首先按楼层在第一个位置绘制所有单元,然后是第二个位置的单元,依此类推。
谢谢!
df_build = pd.DataFrame({'floor':[1,1,1,2,2,2,3,3,3],'unidad':[100,101,102,200,201,202,300,301,302],
                         'rsf':[2000,1000,1500,1500,2000,1000,1000,1500,2000],'order':[0,1,2,0,1,2,0,1,2],
                         'year':[2008,2009,2010,2009,2010,2011,2010,2011,2012]})

assign_colors = {2008:'tab:red',2009:'tab:blue',2010:'tab:green',2011:'tab:pink',2012:'tab:olive'}

labels = list(df_build.floor.unique())
order_0 = df_build[df_build.order==0].rsf.values
c1=list(df_build[df_build.order==0].year.replace(assign_colors).values)
order_1 = df_build[df_build.order==1].rsf.values
c2=list(df_build[df_build.order==1].year.replace(assign_colors).values)
order_2 = df_build[df_build.order==2].rsf.values
c3=list(df_build[df_build.order==2].year.replace(assign_colors).values)

width = 0.35 

fig, ax = plt.subplots()

ax.barh(labels, order_0, width,color=c1)
ax.barh(labels, order_1, width,left=order_0, color=c2)
ax.barh(labels, order_2, width,left=order_0+order_1, color=c3)

ax.set_ylabel('floor')
ax.set_title('Stacking Plan')
#ax.legend()

plt.show()

尝试旋转数据并循环:

# map the color
df_build['color'] = df_build['year'].map(assign_colors)

# pivot the data
plot_df = df_build.pivot(index='floor', columns='order')

# plot by row
fig, ax = plt.subplots()

for i in df.index:
    rights = plot_df.loc[i,'rsf'].cumsum()
    lefts = rights.shift(fill_value=0)
    ax.barh(i, plot_df.loc[i,'rsf'], left=lefts, color=plot_df.loc[i,'color'])
    
    for j in range(len(rights)):
        label = plot_df.loc[i, 'unidad'].iloc[j]
        rsf = plot_df.loc[i, 'rsf'].iloc[j]
        x = (rights.iloc[j] + lefts.iloc[j]) / 2
        ax.text(x, i, f'{label}-{rsf}', ha='center')

输出: