Matplotlib es la librería de referencia para generar gráficos en Python. Lleva más de 20 años en activo, se integra con NumPy, pandas y Jupyter, y sigue siendo la base sobre la que se construyen otras herramientas de visualización como seaborn o plotly. Si trabajas con datos en Python, antes o después acabas usándola.
Este tutorial explica cómo instalarla, muestra los tipos de gráficos más habituales con código listo para ejecutar, y da algunos trucos para personalizar la salida según tus necesidades. Todo el código funciona con Python 3.8 o superior y matplotlib 3.x.
Instalación
Con pip, una línea es suficiente:
pip install matplotlib
Si usas conda (Anaconda o Miniconda):
conda install matplotlib
Si tu proyecto ya usa uv, el gestor de paquetes moderno:
uv add matplotlib
Para verificar que está bien instalada:
python -c "import matplotlib; print(matplotlib.__version__)"
Gráfico de líneas
El gráfico de líneas es el más básico. matplotlib.pyplot ofrece una interfaz de alto nivel similar a la de MATLAB: funciones que actúan sobre la figura activa sin que tengas que gestionar objetos manualmente.
import matplotlib.pyplot as plt x = (4, 8, 13, 17, 20) y = (54, 67, 98, 78, 45) plt.plot(x, y) plt.show()
El resultado es el siguiente:
La línea que ves es la que matplotlib genera por defecto en cuanto a color y grosor. Para cambiarla basta con pasar un especificador de formato como tercer argumento. Por ejemplo, 'g--d' produce una línea verde discontinua con marcadores en forma de diamante:
plt.plot([4, 8, 13, 17, 20], [54, 67, 98, 78, 45], 'g--d')
Con la API orientada a objetos tienes más control. Es la forma recomendada cuando el gráfico tiene varias series o necesitas ajustes finos:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label='sen(x)', color='steelblue', linewidth=2)
ax.plot(x, np.cos(x), label='cos(x)', color='tomato', linestyle='--')
ax.set_xlabel('x (radianes)')
ax.set_ylabel('Amplitud')
ax.set_title('Funciones trigonométricas')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Gráfico de dispersión
El scatter plot muestra la relación entre dos variables. Útil para detectar correlaciones, valores atípicos o agrupaciones en los datos.
import matplotlib.pyplot as plt x = [2, 4, 6, 7, 9, 13, 19, 26, 29, 31, 36, 40, 48, 51, 57, 67, 69, 71, 78, 88] y = [54, 72, 43, 2, 8, 98, 109, 5, 35, 28, 48, 83, 94, 84, 73, 11, 464, 75, 200, 54] plt.scatter(x, y) plt.show()
Se puede añadir una tercera variable codificada en color o en tamaño de los puntos:
import matplotlib.pyplot as plt import numpy as np n = 50 x = np.random.rand(n) y = np.random.rand(n) colores = np.random.rand(n) tamanyo = 200 * np.random.rand(n) plt.scatter(x, y, c=colores, s=tamanyo, alpha=0.6, cmap='viridis') plt.colorbar() plt.show()
Histogramas
Un histograma agrupa los datos en rangos (bins) y muestra la frecuencia de cada uno. Es el gráfico habitual para visualizar distribuciones.
import matplotlib.pyplot as plt
x = [2, 4, 6, 5, 42, 543, 5, 3, 73, 64, 42, 97, 63, 76, 63, 8, 73, 97, 23, 45,
56, 89, 45, 3, 23, 2, 5, 78, 23, 56, 67, 78, 8, 3, 78, 34, 67, 23, 324, 234,
43, 544, 54, 33, 223, 443, 444, 234, 76, 432, 233, 23, 232, 243, 222, 221,
254, 222, 276, 300, 353, 354, 387, 364, 309]
n, bins, patches = plt.hist(x, bins=6, facecolor='green', edgecolor='white')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.title('Histograma')
plt.show()
Gráfico de barras
Para comparar categorías discretas el gráfico de barras es más legible que el de líneas. Se genera con plt.bar() para barras verticales o plt.barh() para horizontales:
import matplotlib.pyplot as plt
lenguajes = ['Python', 'JavaScript', 'Java', 'C++', 'Rust']
popularidad = [30.3, 25.1, 17.8, 10.4, 6.2]
fig, ax = plt.subplots()
barras = ax.bar(lenguajes, popularidad, color=['#3776ab', '#f7df1e', '#b07219', '#00599c', '#dea584'])
ax.set_ylabel('Uso (%)')
ax.set_title('Lenguajes más usados en 2025')
ax.bar_label(barras, fmt='%.1f%%', padding=3)
plt.tight_layout()
plt.show()
Múltiples gráficos con subplots
Cuando quieres mostrar varios gráficos juntos, plt.subplots() devuelve una cuadrícula de ejes sobre la que trabajas de forma independiente:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
axes[0, 0].plot(x, np.sin(x), color='steelblue')
axes[0, 0].set_title('Seno')
axes[0, 1].plot(x, np.cos(x), color='tomato')
axes[0, 1].set_title('Coseno')
axes[1, 0].plot(x, np.exp(-x / 3), color='seagreen')
axes[1, 0].set_title('Exponencial decreciente')
axes[1, 1].plot(x, x ** 2, color='darkorange')
axes[1, 1].set_title('Cuadrática')
for ax in axes.flat:
ax.grid(True, alpha=0.3)
plt.suptitle('Panel de funciones', fontsize=14)
plt.tight_layout()
plt.show()
Guardar la figura en fichero
Para guardar el gráfico en lugar de mostrarlo en pantalla se usa savefig(). Acepta PNG, PDF, SVG y otros formatos. El parámetro dpi controla la resolución:
plt.savefig('grafico.png', dpi=150, bbox_inches='tight')
plt.savefig('grafico.pdf') # listo para LaTeX o informes
Integración con pandas y Jupyter
Si ya trabajas con pandas, los DataFrames tienen un método .plot() que internamente usa matplotlib. No hace falta importarla explícitamente:
import pandas as pd
df = pd.DataFrame({
'mes': ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun'],
'ventas': [120, 145, 98, 167, 210, 189]
})
df.plot(x='mes', y='ventas', kind='bar', legend=False, color='steelblue')
import matplotlib.pyplot as plt
plt.title('Ventas por mes')
plt.tight_layout()
plt.show()
En Jupyter Notebook añade %matplotlib inline al inicio del cuaderno para que los gráficos se muestren directamente debajo de cada celda, sin necesidad de llamar a plt.show().
Seaborn: cuando matplotlib se queda corto
Seaborn se construye sobre matplotlib y añade tipos de gráficos estadísticos de forma sencilla (boxplots, violinplots, heatmaps, pairplots). Si tu análisis es exploratorio, merece la pena instalarlo junto a matplotlib:
pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('tips')
sns.boxplot(x='day', y='total_bill', hue='sex', data=df)
plt.title('Cuenta total por día y sexo')
plt.show()
Para seguir ampliando conocimientos de Python, puedes consultar nuestro artículo sobre las 20 librerías de Python más útiles o explorar los frameworks web de Python si quieres llevar tus gráficos a una aplicación web.
