Stacked Bar 100%
100% Stacked Bar
Qué es
Barras que siempre alcanzan el 100%, divididas en segmentos proporcionales. Muestra la composición relativa de categorías a lo largo del tiempo o entre grupos.
Para qué sirve
Para comparar cómo cambia la composición porcentual entre grupos o períodos, cuando los totales absolutos no son el foco.
Cómo leerlo
Anatomía
La convención de marcar la línea del 100% con el mismo peso visual que la línea de cero quedó codificada formalmente a comienzos del siglo XX, en algunos de los primeros manuales dedicados íntegramente a métodos gráficos de presentación de datos, que incluían entre sus reglas la de dar a la línea del 100% el mismo grosor que a la línea de cero. Esas mismas reglas terminaron adoptadas como estándares de presentación por comités técnicos de la época. La normalización a 100% es un intercambio deliberado, no gratuito: se sacrifica la posibilidad de comparar el total absoluto entre barras —todas miden lo mismo en el gráfico, sea cual sea su magnitud real— a cambio de que comparar la composición proporcional entre categorías sea instantáneo, sin tener que estimar visualmente qué porcentaje representa cada segmento de un total que varía barra a barra.
Por qué funciona
Fundamento perceptivo
Permite comparar proporciones entre grupos sin que las diferencias en tamaño total dominen la visualización.
Errores comunes
Sin valores absolutos de respaldo
Al normalizar todo a porcentajes, un stacked bar 100% pierde por completo la información sobre las magnitudes reales detrás de cada barra —dos barras pueden verse idénticas en proporciones aunque una represente 10 casos y la otra 10.000. Complementar el gráfico con las cifras absolutas, aunque sea en una tabla aparte o en el tooltip, evita esa pérdida de contexto.
Demasiados segmentos por barra
Cuando cada barra se divide en más de 5 o 6 categorías, los segmentos más chicos se vuelven tan angostos que ni el color ni ninguna etiqueta caben dentro de ellos, y el lector no puede identificar qué representa cada franja diminuta. Agrupar las categorías menores en un segmento "otros" mantiene la barra legible sin perder la proporción general.
Comparar segmentos intermedios entre barras
Solo el primer segmento de cada barra apilada comparte una línea base común (el cero); todos los segmentos siguientes empiezan en una posición distinta según lo que viene antes, lo que hace que comparar el tamaño del mismo segmento entre dos barras distintas sea perceptualmente mucho más difícil que comparar el primero. Cuando esa comparación es el punto central del análisis, un gráfico de barras agrupadas suele comunicarla mejor.
Dónde se usa
Contextos de aplicación

Cuota de mercado por empresa
Participación de cada competidor dentro de una categoría, mostrada como porcentaje del total del mercado en cada período.

Composición de ingresos por línea de negocio
Qué porcentaje de los ingresos totales aporta cada línea de negocio, comparado período a período.

Distribución de votos por partido
Porcentaje de votos que obtiene cada partido o candidato sobre el total, comparable entre distintas elecciones.
Cómo construirlo
El mismo gráfico, en 11 librerías open source
Cada librería resuelve las mismas decisiones de diseño, como la escala, el espaciado entre barras o la inserción de la etiqueta de valor, de un modo distinto. Algunas las automatizan; otras las dejan explícitas en el código, a criterio de quien lo escribe. Comparar once implementaciones con los mismos datos y el mismo color de marca aísla esa diferencia, que de otro modo queda oculta detrás de estilos visuales distintos.
Sin modo "100%" dedicado: el mismo bar() con bottom= de una barra apilada normal alcanza, porque estos datos ya son participaciones que suman 100 por año —con conteos crudos, habría que normalizarlos a mano antes de graficar.
import matplotlib.pyplot as plt
# BCN, evolucion de la matricula escolar chilena por dependencia,
# 2004-2022 -- ya son participaciones porcentuales que suman 100.
anios = ["2004", "2010", "2016", "2022"]
publica = [51.4, 42.1, 37.2, 36.7]
subvencionada = [41.0, 50.8, 54.7, 54.1]
pagada = [7.6, 7.1, 8.1, 9.2]
# matplotlib no tiene un modo "100%" dedicado: el mismo bar() con
# bottom= de una barra apilada normal alcanza, porque los datos ya
# suman 100 por año.
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(anios, publica, color="#760D3E", width=0.55, label="Pública")
ax.bar(anios, subvencionada, bottom=publica, color="#D2601F", width=0.55, label="Part. subvencionada")
bottom2 = [a + b for a, b in zip(publica, subvencionada)]
ax.bar(anios, pagada, bottom=bottom2, color="#C2A878", width=0.55, label="Part. pagada")
ax.legend(frameon=False, loc="upper center", bbox_to_anchor=(0.5, -0.08), ncol=3)
plt.tight_layout()
plt.show()Herramientas para construirlo
No-code, desktop y plataformas web, con su licencia visible, abierta o comercial.
Términos relacionados
Con datos reales
Ejemplos de uso.
¿Cómo cambió la matrícula escolar chilena por dependencia?
Participación de cada tipo de establecimiento sobre el total de estudiantes matriculados, 2004-2022. La educación particular subvencionada pasó a ser mayoría mientras la matrícula pública perdía peso.
Fuente: Biblioteca del Congreso Nacional (BCN), con datos del Centro de Estudios Mineduc
Gráficos relacionados