Skip to content

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ámetroTipoDescripción
xtipo arrayPosiciones de las barras (categorías)
heighttipo arrayAlturas de las barras (valores)
widthfloatAncho de barra (predeterminado 0.8)
bottomtipo arrayCoordenada Y de la base de las barras (para apilar)
colorcolor o arrayColor(es) de relleno de las barras
edgecolorcolorColor del borde de las barras
linewidthfloatAncho de la línea del borde
yerr / xerrtipo arrayTamaños de barras de error
capsizefloatAncho del remate de las barras de error
alignstrAlineación de barras ('center' o 'edge')
labelstrEtiqueta de la leyenda
alphafloatTransparencia (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.

📚