Gráfico de barras astackdas horizontales en Matplotlib

Estoy intentando crear un gráfico de barras astackdas horizontales utilizando matplotlib pero no puedo ver cómo hacer que las barras se matplotlib realmente en lugar de que todas empiecen en el eje y.

Aquí está mi código de prueba.

 fig = plt.figure() ax = fig.add_subplot(1,1,1) plot_chart(df, fig, ax) ind = arange(df.shape[0]) ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00') ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0') ax.barh(ind, df['EndUse_80_nan'], color='#0070C0') plt.show() 

Editado para usar kwarg left después de ver el comentario de tcaswell.

 fig = plt.figure() ax = fig.add_subplot(1,1,1) plot_chart(df, fig, ax) ind = arange(df.shape[0]) ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') lefts = df['EndUse_91_1.0'] ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts) lefts = lefts + df['EndUse_91_1.0'] ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts) lefts = lefts + df['EndUse_91_1.0'] ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts) plt.show() 

Este parece ser el enfoque correcto, pero falla si no hay datos para una barra en particular cuando intenta agregar nan a un valor que luego devuelve nan .

Como está utilizando pandas, vale la pena mencionar que puede hacer plots de barras astackdas de forma nativa:

 df2.plot(kind='bar', stacked=True) 

Vea la sección de visualización de los documentos .

Aquí hay una solución, aunque estoy seguro de que debe haber una mejor manera de hacerlo. La parte series.fillna(0) reemplaza cualquier nan por 0.

 fig = plt.figure() ax = fig.add_subplot(1,1,1) plot_chart(df, fig, ax) ind = arange(df.shape[0]) ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') lefts = df['EndUse_91_1.0'].fillna(0) ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts) lefts = lefts + df['EndUse_91_1.0'].fillna(0) ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts) lefts = lefts + df['EndUse_91_1.0'].fillna(0) ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts) plt.show() 

Como nota al margen, puede envolver el código repetitivo en un bucle a través de:

 data_lst = [df['EndUse_91_1.0'], ..] color_lst = ["FFFF00", ..] left = 0 for data, color in zip(data_lst, color_lst): ax.barh(ind, data, color=color, left=left) left += data 

módulo de datos de saneamiento

Hubo otra buena respuesta, aquí en Stack Overflow. ¡Dibuja los Hbars mientras se anexa en una lista! Ve a responder.

La solución de otro post.

También es posible (y muy fácil) simplemente agregar todos los elementos mediante el uso de Map y el add operator . Como ya se respondió en la pregunta Elemento sabio ¿Adición de 2 listas en Python? . O simplemente usa una matriz numpy.