Matplotlib Gráfico de Barras: Guía Completa de plt.bar() y plt.barh()
Updated on
Los gráficos de barras son la forma más común de comparar cantidades entre categorías. Ingresos por trimestre, puntuaciones por estudiante, conteos por estado -- los gráficos de barras hacen estas comparaciones instantáneamente legibles. Pero crear gráficos de barras efectivos en Matplotlib requiere más que una simple llamada a plt.bar(). Necesita manejar comparaciones agrupadas, composiciones apiladas, diseños horizontales para etiquetas largas y anotaciones adecuadas que hagan los gráficos autoexplicativos.
Esta guía cubre cada patrón de gráfico de barras que necesitará en Matplotlib, desde barras verticales básicas hasta configuraciones agrupadas y apiladas avanzadas.
Gráfico de Barras Vertical Básico
import matplotlib.pyplot as plt
categories = ['Python', 'JavaScript', 'Java', 'C++', 'Go']
values = [35, 28, 22, 15, 12]
plt.figure(figsize=(8, 5))
plt.bar(categories, values, color='steelblue', edgecolor='black', linewidth=0.5)
plt.xlabel('Lenguaje')
plt.ylabel('Puntuación de Popularidad')
plt.title('Popularidad de Lenguajes de Programación')
plt.show()Gráfico de Barras Horizontal con plt.barh()
Use barras horizontales cuando las etiquetas de categoría son largas o cuando tiene muchas categorías:
import matplotlib.pyplot as plt
frameworks = ['React', 'Vue.js', 'Angular', 'Svelte', 'Next.js',
'Django', 'Flask', 'FastAPI', 'Express', 'Rails']
stars = [220, 207, 95, 78, 124, 78, 67, 74, 64, 55]
plt.figure(figsize=(10, 6))
plt.barh(frameworks, stars, color='#3498db', edgecolor='white')
plt.xlabel('Estrellas en GitHub (miles)')
plt.title('Popularidad de Frameworks por Estrellas en GitHub')
plt.gca().invert_yaxis() # Mayor arriba
plt.tight_layout()
plt.show()Personalización de Colores
import matplotlib.pyplot as plt
categories = ['Q1', 'Q2', 'Q3', 'Q4']
revenue = [120, 150, 180, 200]
# Color diferente por barra
colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db']
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, revenue, color=colors, edgecolor='black', linewidth=0.5)
plt.ylabel('Ingresos ($K)')
plt.title('Ingresos Trimestrales')
plt.show()Agregar Etiquetas de Valor en las Barras
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, values, color='steelblue')
# Agregar etiquetas de valor encima de cada barra
for bar, val in zip(bars, values):
plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 1,
str(val), ha='center', va='bottom', fontsize=11)
plt.ylabel('Valor')
plt.title('Gráfico de Barras con Etiquetas de Valor')
plt.show()Gráfico de Barras Agrupado
Compare múltiples series lado a lado:
import matplotlib.pyplot as plt
import numpy as np
categories = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [20, 35, 30, 35]
product_b = [25, 32, 34, 20]
product_c = [15, 20, 25, 30]
x = np.arange(len(categories))
width = 0.25
plt.figure(figsize=(10, 6))
plt.bar(x - width, product_a, width, label='Producto A', color='#e74c3c')
plt.bar(x, product_b, width, label='Producto B', color='#3498db')
plt.bar(x + width, product_c, width, label='Producto C', color='#2ecc71')
plt.xlabel('Trimestre')
plt.ylabel('Ventas ($K)')
plt.title('Ventas Trimestrales por Producto')
plt.xticks(x, categories)
plt.legend()
plt.tight_layout()
plt.show()Gráfico de Barras Apilado
Muestre la composición de cada categoría:
import matplotlib.pyplot as plt
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mobile = [30, 35, 40, 45]
desktop = [50, 45, 35, 30]
tablet = [20, 20, 25, 25]
plt.figure(figsize=(8, 6))
plt.bar(quarters, mobile, label='Móvil', color='#3498db')
plt.bar(quarters, desktop, bottom=mobile, label='Escritorio', color='#e74c3c')
# Para la tercera pila, calcular el fondo acumulado
import numpy as np
bottom_2 = np.array(mobile) + np.array(desktop)
plt.bar(quarters, tablet, bottom=bottom_2, label='Tablet', color='#2ecc71')
plt.ylabel('Tráfico (%)')
plt.title('Fuentes de Tráfico por Trimestre')
plt.legend()
plt.show()Barras de Error
import matplotlib.pyplot as plt
import numpy as np
categories = ['Control', 'Tratamiento A', 'Tratamiento B', 'Tratamiento C']
means = [10.2, 15.8, 14.3, 18.1]
errors = [1.2, 2.1, 1.8, 2.5]
plt.figure(figsize=(8, 5))
plt.bar(categories, means, yerr=errors, capsize=5,
color='steelblue', edgecolor='black', linewidth=0.5)
plt.ylabel('Valor de Respuesta')
plt.title('Efectos del Tratamiento con Barras de Error')
plt.show()Referencia de Parámetros de plt.bar()
| Parámetro | Tipo | Descripción |
|---|---|---|
x | tipo array | Posiciones de las barras (categorías) |
height | tipo array | Alturas de las barras (valores) |
width | float | Ancho de barra (predeterminado 0.8) |
bottom | tipo array | Coordenada Y de la base de las barras (para apilar) |
color | color o array | Color(es) de relleno de las barras |
edgecolor | color | Color del borde de las barras |
linewidth | float | Ancho de la línea del borde |
yerr / xerr | tipo array | Tamaños de barras de error |
capsize | float | Ancho del remate de las barras de error |
align | str | Alineación de barras ('center' o 'edge') |
label | str | Etiqueta de la leyenda |
alpha | float | Transparencia (0-1) |
Gráficos de Barras Interactivos con PyGWalker
Para análisis exploratorio de datos, PyGWalker (opens in a new tab) le permite crear gráficos de barras interactivos arrastrando y soltando columnas de su DataFrame en Jupyter:
import pandas as pd
import pygwalker as pyg
df = pd.DataFrame({
'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'] * 3,
'Product': ['A'] * 4 + ['B'] * 4 + ['C'] * 4,
'Sales': [20, 35, 30, 35, 25, 32, 34, 20, 15, 20, 25, 30]
})
walker = pyg.walk(df)FAQ
¿Cómo creo un gráfico de barras en Matplotlib?
Use plt.bar(categorías, valores) para barras verticales o plt.barh(categorías, valores) para barras horizontales. Pase listas o arrays para las categorías y sus valores correspondientes. Agregue plt.xlabel(), plt.ylabel() y plt.title() para etiquetas.
¿Cómo creo un gráfico de barras agrupado?
Use np.arange() para posiciones x y desplace cada grupo por el ancho de barra. Llame a plt.bar() múltiples veces con posiciones x desplazadas: plt.bar(x - width, data1, width), plt.bar(x, data2, width), etc. Establezca las etiquetas de marca con plt.xticks(x, categorías).
¿Cómo agrego etiquetas de valor encima de las barras?
Itere sobre los objetos de barra y use plt.text(). Para cada barra, calcule la posición x central con bar.get_x() + bar.get_width() / 2 y la posición y con bar.get_height(). Use ha='center' para alineación horizontal.
¿Cómo creo un gráfico de barras apilado?
Use el parámetro bottom en llamadas sucesivas a plt.bar(). La primera llamada no tiene bottom. La segunda llamada usa el primer conjunto de datos como bottom. Para una tercera pila, sume los dos primeros conjuntos de datos como bottom.
¿Cuándo debo usar gráficos de barras horizontales vs verticales?
Use barras horizontales (plt.barh()) cuando las etiquetas de categoría son largas, cuando tiene muchas categorías (más de 8-10), o cuando compara con una línea base. Use barras verticales (plt.bar()) para categorías de series temporales (meses, trimestres) o cuando tiene pocas categorías con etiquetas cortas.
Conclusión
Los plt.bar() y plt.barh() de Matplotlib cubren toda necesidad de gráficos de barras: comparaciones básicas, multi-series agrupadas, composiciones apiladas y presentaciones anotadas. Para barras agrupadas, desplace posiciones x con np.arange(). Para barras apiladas, use el parámetro bottom. Siempre agregue etiquetas de valor para claridad y elija el diseño horizontal cuando las etiquetas sean largas.