Tutoriales Interactivos
BlogIniciar sesiónComenzar gratis
Inicio›Blog›Visualización de Datos›Barras apiladas para mostrar composición

Barras apiladas para mostrar composición

Cuando necesitas mostrar cómo se compone un total y al mismo tiempo comparar esa composición entre varias categorías, las barras apiladas son la herramienta indicada. A diferencia de la torta, que muestra un solo total, las barras apiladas permiten poner varios totales lado a lado.

Barras apiladas básicas

import matplotlib.pyplot as plt
import numpy as np

trimestres = ['Q1', 'Q2', 'Q3', 'Q4']
producto_a = [30, 35, 40, 45]
producto_b = [20, 25, 22, 28]
producto_c = [15, 18, 20, 22]

plt.bar(trimestres, producto_a, label='Producto A', color='#0984e3')
plt.bar(trimestres, producto_b, bottom=producto_a, label='Producto B', color='#00b894')
plt.bar(trimestres, producto_c,
        bottom=np.array(producto_a) + np.array(producto_b),
        label='Producto C', color='#fdcb6e')

plt.title('Ventas trimestrales por producto')
plt.ylabel('Miles de $')
plt.legend()
plt.show()

El parámetro bottom indica dónde empieza cada segmento. La primera serie no necesita bottom (empieza en 0). La segunda usa los valores de la primera como base. La tercera usa la suma de las dos anteriores.

Cómo leer barras apiladas

Cada barra completa representa el total. Los segmentos dentro de la barra representan la contribución de cada parte.

Lo que puedes interpretar fácilmente:

  • El total de cada categoría (la altura completa de la barra)
  • La contribución del primer segmento (empieza en 0, fácil de comparar)
  • Tendencias generales de crecimiento o decrecimiento

Lo que es difícil de interpretar:

  • La contribución exacta de los segmentos intermedios (no empiezan en 0)

Barras apiladas al 100%

Si lo que importa es la proporción y no el valor absoluto, puedes normalizar las barras al 100%:

import matplotlib.pyplot as plt
import numpy as np

trimestres = ['Q1', 'Q2', 'Q3', 'Q4']
producto_a = np.array([30, 35, 40, 45])
producto_b = np.array([20, 25, 22, 28])
producto_c = np.array([15, 18, 20, 22])

totales = producto_a + producto_b + producto_c
a_pct = producto_a / totales * 100
b_pct = producto_b / totales * 100
c_pct = producto_c / totales * 100

plt.bar(trimestres, a_pct, label='Producto A', color='#0984e3')
plt.bar(trimestres, b_pct, bottom=a_pct, label='Producto B', color='#00b894')
plt.bar(trimestres, c_pct, bottom=a_pct + b_pct, label='Producto C', color='#fdcb6e')

plt.title('Composición de ventas por trimestre')
plt.ylabel('Porcentaje (%)')
plt.legend()
plt.show()

Todas las barras tienen la misma altura (100%) y lo que varía es la proporción de cada segmento. Es útil cuando los totales son muy distintos y quieres comparar composición.

Cuándo usar cada tipo

NecesidadGráfico recomendado
Proporción de un solo totalTorta (máx. 5 categorías)
Comparar composición entre gruposBarras apiladas
Solo comparar proporciones (sin totales)Barras apiladas al 100%
Comparar valores exactosBarras agrupadas (lado a lado)

Errores frecuentes

Usar demasiados segmentos: con más de 4 o 5 segmentos por barra, los colores se confunden y los segmentos pequeños son invisibles. Agrupa las categorías menores en "Otros".

No incluir leyenda: sin leyenda, los colores no significan nada. Siempre usa plt.legend().

Olvidar numpy para calcular los bottoms: al sumar listas de Python normales no obtienes una suma elemento a elemento. Usa np.array() o convierte las listas antes de sumar.

Aprende haciendo, no solo leyendo

Leer es el primer paso. El verdadero aprendizaje ocurre cuando practicas con ejercicios reales de Visualización de Datos y recibes corrección inmediata de IA.

Comenzar gratis →
Desafío Latam
+56 9 5117 7975
+52 1 55 4047 7251
[email protected]

Carreras

  • Full Stack JavaScript
  • Diseño UX/UI
  • Data Science
  • Data Analytics

Comunidad

  • Blog
  • Becas
  • Trabaja con Nosotros
  • Políticas de Calidad

Síguenos

© 2026 Desafío Latam. Todos los derechos reservados.