Solución:
Por que escribiste va="bottom"
? Tienes que usar va="center"
.
- El siguiente método es más conciso y se escala más fácilmente con el número de columnas.
- Poner los datos en un
pandas.DataFrame
es la forma más sencilla de trazar un diagrama de barras apiladas. - Utilizando
pandas.DataFrame.plot.bar(stacked=True)
es la forma más sencilla de trazar un diagrama de barras apiladas.- Este método devuelve un
matplotlib.axes.Axes
o unnumpy.ndarray
de ellos.
- Este método devuelve un
- Utilizando el
.patches
El método descomprime una lista dematplotlib.patches.Rectangle
objetos, uno para cada una de las secciones de la barra apilada.- Cada
.Rectangle
tiene métodos para extraer los distintos valores que definen el rectángulo. - Cada
.Rectangle
está en orden de izquierda a derecha y de abajo hacia arriba, por lo que todos los.Rectangle
Los objetos, para cada nivel, aparecen en orden, al iterar a través.patches
.
- Cada
- Las etiquetas están hechas con una cuerda f,
label_text = f'{height}'
, por lo que se puede agregar cualquier texto adicional según sea necesario, comolabel_text = f'{height}%'
Importaciones
import pandas as pd
import matplotlib.pyplot as plt
Datos
A = [45, 17, 47]
B = [91, 70, 72]
C = [68, 43, 13]
# pandas dataframe
df = pd.DataFrame(data={'A': A, 'B': B, 'C': C})
df.index = ['C1', 'C2', 'C3']
A B C
C1 45 91 68
C2 17 70 43
C3 47 72 13
Trama
plt.style.use('ggplot')
ax = df.plot(stacked=True, kind='bar', figsize=(12, 8), rot="horizontal")
# .patches is everything inside of the chart
for rect in ax.patches:
# Find where everything is located
height = rect.get_height()
width = rect.get_width()
x = rect.get_x()
y = rect.get_y()
# The height of the bar is the data value and can be used as the label
label_text = f'{height}' # f'{height:.2f}' to format decimal values
# ax.text(x, y, text)
label_x = x + width / 2
label_y = y + height / 2
# plot only when height is greater than specified value
if height > 0:
ax.text(label_x, label_y, label_text, ha="center", va="center", fontsize=8)
ax.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.)
ax.set_ylabel("Count", fontsize=18)
ax.set_xlabel("Class", fontsize=18)
plt.show()
- Para trazar una barra horizontal:
kind='barh'
label_text = f'{width}'
if width > 0:
- Atribución: jsoma / chart.py
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)