Gráficos y Visualización con Python y matplotlib
matplotlib es la librería de visualización de referencia en Python. Permite crear gráficos de líneas, barras, circulares, de dispersión y exportarlos a PNG, PDF, SVG o mostrarlos en pantalla.
Instalación
pip install matplotlib numpy pandas
Gráfico de Líneas
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(x, y1, label="sin(x)", color="#4a9eff", linewidth=2)
ax.plot(x, y2, label="cos(x)", color="#ff6b6b", linewidth=2, linestyle="--")
ax.set_title("Funciones Trigonométricas", fontsize=14)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lineas.png", dpi=150, bbox_inches="tight")
print("Gráfico guardado: lineas.png")
plt.close()
Gráfico de Barras
import matplotlib.pyplot as plt
import numpy as np
meses = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"]
ventas = [12500, 9800, 15200, 13400, 17800, 14300]
objetivos = [12000, 12000, 14000, 14000, 16000, 16000]
x = np.arange(len(meses))
w = 0.35
fig, ax = plt.subplots(figsize=(10, 6))
barras1 = ax.bar(x - w/2, ventas, w, label="Ventas Reales", color="#4a9eff")
barras2 = ax.bar(x + w/2, objetivos, w, label="Objetivo", color="#ff6b6b", alpha=0.7)
# Etiquetas de valor encima de cada barra
for barra in barras1:
ax.annotate(f"{barra.get_height():,}",
xy=(barra.get_x() + barra.get_width()/2, barra.get_height()),
xytext=(0, 4), textcoords="offset points", ha="center", fontsize=9)
ax.set_title("Ventas vs Objetivo 2024", fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(meses)
ax.set_ylabel("€")
ax.legend()
ax.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.savefig("barras.png", dpi=150, bbox_inches="tight")
plt.close()
Gráfico Circular (Pie)
import matplotlib.pyplot as plt
categorias = ["Alquiler", "Personal", "Marketing", "Tecnología", "Otros"]
valores = [35, 28, 18, 12, 7]
colores = ["#4a9eff", "#ff6b6b", "#51cf66", "#ffd43b", "#cc5de8"]
explotar = [0, 0, 0.05, 0, 0] # Resaltar Marketing
fig, ax = plt.subplots(figsize=(8, 8))
wedges, texts, autotexts = ax.pie(
valores,
labels=categorias,
colors=colores,
explode=explotar,
autopct="%1.1f%%",
startangle=90,
shadow=True
)
for autotext in autotexts:
autotext.set_fontsize(10)
autotext.set_fontweight("bold")
ax.set_title("Distribución de Gastos 2024", fontsize=14, pad=20)
plt.savefig("circular.png", dpi=150, bbox_inches="tight")
plt.close()
Gráfico de Dispersión
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 200
x = np.random.randn(n)
y = 2 * x + np.random.randn(n) * 0.8
colores = np.abs(x + y)
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=colores, cmap="viridis", alpha=0.7, s=50, edgecolors="none")
plt.colorbar(scatter, ax=ax, label="Intensidad")
m, b = np.polyfit(x, y, 1)
x_lin = np.linspace(x.min(), x.max(), 100)
ax.plot(x_lin, m*x_lin + b, color="red", linewidth=2, linestyle="--", label=f"y={m:.2f}x+{b:.2f}")
ax.set_title("Dispersión con Línea de Tendencia")
ax.set_xlabel("Variable X")
ax.set_ylabel("Variable Y")
ax.legend()
ax.grid(alpha=0.3)
plt.tight_layout()
plt.savefig("dispersion.png", dpi=150, bbox_inches="tight")
plt.close()
Dashboard Multi-panel
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle("Dashboard de Ventas 2024", fontsize=16, fontweight="bold")
meses = ["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"]
ventas = [12,10,15,13,18,14,16,15,19,17,20,22]
# Línea
axes[0,0].plot(meses, ventas, "o-", color="#4a9eff", linewidth=2)
axes[0,0].set_title("Evolución de Ventas")
axes[0,0].grid(alpha=0.3)
# Barras
axes[0,1].bar(meses[:6], ventas[:6], color="#51cf66")
axes[0,1].set_title("Ventas 1er Semestre")
# Circular
canales = ["Online","Tienda","B2B"]
pcts = [55, 30, 15]
axes[1,0].pie(pcts, labels=canales, autopct="%1.0f%%", startangle=90)
axes[1,0].set_title("Canal de Venta")
# Histograma
datos = np.random.normal(15, 3, 1000)
axes[1,1].hist(datos, bins=20, color="#ffd43b", edgecolor="white")
axes[1,1].set_title("Distribución Ticket Promedio")
axes[1,1].set_xlabel("€")
plt.tight_layout()
plt.savefig("dashboard.png", dpi=150, bbox_inches="tight")
print("Dashboard guardado: dashboard.png")
plt.close()
Exportar a PDF y SVG
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
# Exportar múltiples gráficos en un solo PDF
with PdfPages("reporte.pdf") as pdf:
fig1, ax1 = plt.subplots()
ax1.plot([1,2,3,4], [10,15,12,18])
ax1.set_title("Ventas Semanales")
pdf.savefig(fig1, bbox_inches="tight")
plt.close(fig1)
fig2, ax2 = plt.subplots()
ax2.bar(["A","B","C"], [30,45,25])
ax2.set_title("Categorías")
pdf.savefig(fig2, bbox_inches="tight")
plt.close(fig2)
print("PDF generado: reporte.pdf (2 páginas)")
# Exportar a SVG (vectorial)
fig, ax = plt.subplots()
ax.plot([1,2,3], [4,2,5])
plt.savefig("grafico.svg", format="svg", bbox_inches="tight")
print("SVG generado: grafico.svg")
plt.close()
Recurso Adicional
Para convertir imágenes PNG, PDF y SVG entre sí sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones frecuentes del catálogo: