Saltar al contenido

Gráfico de barras apiladas con etiquetas centradas

Solución:

Por que escribiste va="bottom"? Tienes que usar va="center".
ingrese la descripción de la imagen aquí

  • 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 un numpy.ndarray de ellos.
  • Utilizando el .patches El método descomprime una lista de matplotlib.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.
  • 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, como label_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()

ingrese la descripción de la imagen aquí

  • 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *