Hoja de Trucos de Matplotlib
Última actualización
Figure y axes
Una figure es la imagen completa. Un axes es un gráfico dentro de ella, y casi todas las llamadas de abajo son métodos de ax.
| Tarea | Código |
|---|---|
| Importar pyplot | import matplotlib.pyplot as plt |
| Una figure con un gráfico | fig, ax = plt.subplots() |
| Fijar el tamaño en pulgadas | fig, ax = plt.subplots(figsize=(8, 4)) |
| Dibujar en los axes | ax.plot(x, y) |
| Mostrar la figure | plt.show() |
| Guardar como PNG nítido | fig.savefig("chart.png", dpi=150, bbox_inches="tight") |
| Guardar como gráfico vectorial | fig.savefig("chart.svg"), fig.savefig("chart.pdf") |
| Fondo transparente | fig.savefig("chart.png", transparent=True) |
| Cerrar una figure para liberar memoria | plt.close(fig) |
| Estilo pyplot rápido para un gráfico | plt.plot(x, y)
plt.title("Quick look")
plt.show() |
Tipos de gráfico
| Tarea | Código |
|---|---|
| Gráfico de líneas | ax.plot(x, y) |
| Gráfico de dispersión | ax.scatter(x, y, s=20, alpha=0.7) |
| Dispersión coloreada por valor, con barra de color | points = ax.scatter(x, y, c=y, cmap="viridis")
fig.colorbar(points, ax=ax) |
| Gráfico de barras | ax.bar(cats, a) |
| Barras horizontales | ax.barh(cats, a) |
| Barras apiladas | ax.bar(cats, a, label="2025")
ax.bar(cats, b, bottom=a, label="2026") |
| Barras agrupadas | pos = np.arange(len(cats))
ax.bar(pos - 0.2, a, width=0.4)
ax.bar(pos + 0.2, b, width=0.4)
ax.set_xticks(pos, labels=cats) |
| Histograma | ax.hist(data, bins=30) |
| Diagrama de caja | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) |
| Diagrama de violín | ax.violinplot([data, data * 2]) |
| Gráfico de tarta | ax.pie([40, 35, 25], labels=cats, autopct="%1.0f%%") |
| Banda entre dos curvas | ax.fill_between(x, y - 0.2, y + 0.2, alpha=0.3) |
| Barras de error | ax.errorbar([1, 2, 3], [4, 5, 3], yerr=[0.5, 0.3, 0.6], fmt="o", capsize=4) |
| Gráfico escalonado | ax.step(x, y, where="mid") |
| Mapa de calor de un array 2D | image = ax.imshow(np.random.default_rng(0).random((5, 5)), cmap="magma")
fig.colorbar(image, ax=ax) |
| Gráfico de contornos rellenos | X, Y = np.meshgrid(x, x)
ax.contourf(X, Y, np.sin(X) * np.cos(Y), levels=20) |
| Densidad de muchos puntos | ax.hexbin(data, data + np.random.default_rng(1).normal(size=200), gridsize=20) |
| Línea de referencia horizontal o vertical | ax.axhline(0, color="gray", linestyle="--"), ax.axvline(5) |
| Sombrear un rango | ax.axvspan(2, 4, alpha=0.2) |
Líneas, marcadores y colores
| Tarea | Código |
|---|---|
| Color, grosor y estilo de línea | ax.plot(x, y, color="tab:red", linewidth=2, linestyle="--") |
| Marcadores en los puntos | ax.plot(x, y, marker="o", markersize=4) |
| Cadena de formato corta | ax.plot(x, y, "g--o") |
| Transparencia | ax.plot(x, y, alpha=0.5) |
| Estilos de línea | "-", "--", "-.", ":" |
| Códigos de marcador | "o", "s", "^", "x", ".", "*" |
| Formas de indicar un color | "tab:blue", "C1", "#1f77b4", (0.2, 0.4, 0.6) |
| n colores de un colormap | colors = plt.colormaps["viridis"](np.linspace(0, 1, 5)) |
| Tu propio ciclo de colores | ax.set_prop_cycle(color=["#0b7285", "#e8590c", "#5f3dc4"]) |
| Barras con borde y tramado | ax.bar(cats, a, color="white", edgecolor="black", hatch="//") |
Títulos, etiquetas y leyendas
| Tarea | Código |
|---|---|
| Título y etiquetas de ejes | ax.set_title("Sales"), ax.set_xlabel("Month"), ax.set_ylabel("EUR") |
| Todo en una sola llamada | ax.set(title="Sales", xlabel="Month", ylabel="EUR") |
| Leyenda a partir de las etiquetas | ax.plot(x, y, label="sin")
ax.legend() |
| Posición y columnas de la leyenda | ax.legend(loc="upper right", ncols=2, frameon=False) |
| Leyenda fuera del gráfico | ax.legend(loc="center left", bbox_to_anchor=(1, 0.5)) |
| Texto en una posición de los datos | ax.text(5, 0.5, "note") |
| Anotación con flecha | ax.annotate("peak", xy=(1.57, 1), xytext=(3, 1.2), arrowprops=dict(arrowstyle="->")) |
| Etiquetas de valor en las barras | bars = ax.bar(cats, a)
ax.bar_label(bars) |
| Título de toda la figure | fig.suptitle("Q1 report") |
| Fórmulas en las etiquetas | ax.set_xlabel(r"$\alpha$ (rad)") |
Ejes, ticks y escalas
| Tarea | Código |
|---|---|
| Límites de los ejes | ax.set_xlim(0, 10), ax.set_ylim(bottom=0) |
| Escala logarítmica | ax.set_yscale("log") |
| Elegir ticks y sus etiquetas | ax.set_xticks([0, 5, 10], labels=["start", "middle", "end"]) |
| Rotar etiquetas de ticks | ax.tick_params(axis="x", labelrotation=45) |
| Líneas de cuadrícula | ax.grid(True, alpha=0.3) |
| Eje en porcentaje | from matplotlib.ticker import PercentFormatter
ax.yaxis.set_major_formatter(PercentFormatter(1.0)) |
| Separador de miles | ax.yaxis.set_major_formatter("{x:,.0f}") |
| Ocultar los bordes superior y derecho | ax.spines[["top", "right"]].set_visible(False) |
| Segundo eje y a la derecha | ax2 = ax.twinx()
ax2.plot(x, y * 100, color="tab:orange") |
| Misma escala en ambos ejes | ax.set_aspect("equal") |
| Invertir un eje | ax.invert_yaxis() |
| Ocultar los ejes por completo | ax.axis("off") |
| Etiquetas de fecha legibles | fig.autofmt_xdate() |
Subplots y layout
plt.subplots(rows, cols) devuelve un array de NumPy de axes. Indéxalo como cualquier array.
| Tarea | Código |
|---|---|
| Cuadrícula de gráficos | fig, axs = plt.subplots(2, 2, figsize=(8, 6)) |
| Dibujar en uno de ellos | axs[0, 1].plot(x, y) |
| Recorrerlos todos | for ax in axs.flat:
ax.grid(True) |
| Compartir un eje entre gráficos | fig, axs = plt.subplots(1, 3, sharey=True) |
| Espaciado que evita solapamientos | fig, axs = plt.subplots(2, 2, layout="constrained") |
| Corregir solapamientos después de dibujar | fig.tight_layout() |
| Columnas de distinto ancho | fig, axs = plt.subplots(1, 2, width_ratios=[3, 1]) |
| Layout con nombres y un panel ancho | fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]])
axd["top"].plot(x, y) |
| Gráfico pequeño dentro de otro | inset = ax.inset_axes([0.6, 0.6, 0.35, 0.35]) |
| Ocultar un panel vacío | axs[0].axis("off") |
Estilos y valores por defecto
| Tarea | Código |
|---|---|
| Usar un estilo integrado | plt.style.use("ggplot") |
| Listar los estilos | plt.style.available |
| Aspecto de seaborn sin seaborn | plt.style.use("seaborn-v0_8-whitegrid") |
| Estilo solo para una figure | with plt.style.context("dark_background"):
fig, ax = plt.subplots() |
| Tamaño de fuente por defecto | plt.rcParams["font.size"] = 12 |
| Tamaño y resolución de figure por defecto | plt.rcParams["figure.figsize"] = (8, 4), plt.rcParams["figure.dpi"] = 120 |
| Volver a los valores por defecto | plt.style.use("default") |
| Colormaps habituales: secuencial, divergente, gris | "viridis", "coolwarm", "Greys" |
Gráficos desde pandas
pandas dibuja con Matplotlib. Pasa ax= para dibujar en tus propios axes, o quédate con el ax que devuelve pandas.
| Tarea | Código |
|---|---|
| Columnas de un DataFrame en tus axes | df.plot(x="month", y="sales", ax=ax) |
| Gráfico de barras de un resumen por grupo | df.groupby("city")["sales"].sum().plot.bar(ax=ax) |
| Seguir dando estilo a lo que dibujó pandas | ax = df.plot(x="month", y="sales")
ax.set_title("Sales") |
| Columnas directamente a Matplotlib | ax.plot(df["month"], df["sales"]) |
Matplotlib 3.11: formas antiguas y qué escribir ahora
El código copiado de tutoriales antiguos puede fallar o lanzar avisos en Matplotlib 3.11. Usa en su lugar las formas de la columna Matplotlib 3.11.
| Tarea | Matplotlib 3.11 | Forma antigua |
|---|---|---|
| Etiquetas del diagrama de caja | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) | labels=["A", "B"] |
| Diagrama de caja o violín horizontal | ax.boxplot(data, orientation="horizontal") | vert=False |
| Obtener un colormap | plt.colormaps["viridis"] | plt.cm.get_cmap("viridis") |
| Estilo seaborn | plt.style.use("seaborn-v0_8") | plt.style.use("seaborn") |
El código de Matplotlib que necesitas para convertir datos en un gráfico claro, ordenado por tarea: figure y axes, tipos de gráfico, líneas y colores, títulos y leyendas, ejes y ticks, subplots y layout, estilos y gráficos desde pandas. Cada fila es un fragmento corto que puedes pegar, con una línea que explica qué hace.
Todo usa el estilo orientado a objetos (fig, ax = plt.subplots() y luego métodos sobre ax) y está escrito para Matplotlib 3.11, la versión que usa Coddy. Las formas antiguas, como labels= en boxplot, solo aparecen en la última tabla, junto a lo que debes escribir en su lugar. Los ejemplos usan x = np.linspace(0, 10, 50), y = np.sin(x) y una muestra de valores normales llamada data. ¿Empiezas con Python? Arranca por la hoja de trucos de Python y ten a mano las hojas de trucos de pandas, NumPy y scikit-learn junto a esta.
Preguntas frecuentes sobre la hoja de trucos de Matplotlib
¿Esta hoja de trucos de Matplotlib es gratis?
¿Cuál es la diferencia entre plt y ax?
plt.plot() dibuja en los axes que estén activos, lo que es rápido para un solo gráfico. fig, ax = plt.subplots() te da la figure y los axes como objetos, así que ax.plot() siempre dibuja justo donde quieres. Usa el estilo ax para cualquier cosa con más de un gráfico y para el código que vayas a conservar.¿Cómo cambio el tamaño de la figure?
figsize en pulgadas al crear la figure: fig, ax = plt.subplots(figsize=(10, 5)). Para cambiar el valor por defecto de todas las figures, asigna plt.rcParams["figure.figsize"] = (10, 5). El tamaño en píxeles de un archivo guardado es figsize por dpi.¿Cómo guardo un gráfico en alta resolución?
fig.savefig("chart.png", dpi=300, bbox_inches="tight"). Un dpi más alto da un PNG más nítido, y bbox_inches="tight" recorta los márgenes vacíos. Para imprimir o para presentaciones, guarda en SVG o PDF, que se mantienen nítidos a cualquier tamaño.¿Por qué se solapan los títulos y las etiquetas de mis subplots?
layout="constrained", como en plt.subplots(2, 2, layout="constrained"), y Matplotlib deja espacio para títulos, etiquetas y barras de color. En una figure que ya existe, llama a fig.tight_layout() después de dibujar.¿Qué versión de Matplotlib cubre esta hoja de trucos?
labels= en boxplot (ahora tick_labels=) y plt.cm.get_cmap (ahora plt.colormaps[...]), están en la última tabla junto a lo que debes escribir en su lugar.