Creación de Gráficos Combinados en Matplotlib con GridSpec
Resumen
Combinar varios gráficos en una sola figura es una habilidad fundamental cuando necesitas comparar datos de forma visual y eficiente. Con GridSpec de Matplotlib puedes diseñar layouts personalizados donde cada subplot ocupa un tamaño y posición específicos dentro de una cuadrícula, logrando resultados mucho más profesionales que con métodos básicos.
¿Qué es GridSpec y por qué usarlo para subplots?
El término GridSpec proviene de grid (cuadrícula) y specification (especificación). Es un módulo de Matplotlib que permite definir una cuadrícula con filas y columnas, y luego asignar cada gráfico a posiciones específicas dentro de ella [0:55]. A diferencia de plt.subplots() convencional, GridSpec ofrece control total sobre las proporciones de altura y ancho de cada celda.
Para importarlo se utiliza:
python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec
Esta importación adicional es la clave para acceder a las funcionalidades de diseño avanzado [1:07].
¿Cómo preparar los datos antes de graficar?
Antes de construir el layout, se generan los datos que alimentarán cada gráfico. En el ejemplo se crean dos conjuntos [2:18]:
Datos para la función seno: se usa np.linspace(0, 10, 100) que genera un arreglo de cien valores igualmente espaciados entre cero y diez. Luego se calcula y = np.sin(x).
Datos para el histograma: se usa np.random.random(100) que genera cien números aleatorios entre cero y uno.
python
x = np.linspace(0, 10, 100)
y = np.sin(x)
datos = np.random.random(100)
¿Cómo se configura la cuadrícula con GridSpec?
La cuadrícula se define especificando el número de filas y columnas, junto con las proporciones de cada una [3:15]:
height_ratios=[2, 1]: la primera fila ocupa el doble de altura que la segunda.
width_ratios=[1, 1]: ambas columnas tienen el mismo ancho.
figsize=(10, 8): establece el tamaño total de la figura en pulgadas.
¿Cómo incrustar cada gráfico en la posición correcta?
Cada subplot se añade a la figura indicando su posición dentro del objeto gs. El sistema de indexación funciona como coordenadas de fila y columna [5:10].
Primer subplot — seno completo (fila superior, ambas columnas):
python
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y, color='blue')
ax1.set_title('Seno de X')
ax1.set_xlabel('X')
ax1.set_ylabel('Seno de X')
La notación gs[0, :] significa fila cero, todas las columnas, por lo que el gráfico ocupa toda la primera fila.
Segundo subplot — histograma (esquina inferior izquierda):
Aquí gs[1, 0] ubica el histograma en la fila uno, columna cero [7:02]. El parámetro bins define veinte divisiones y edgecolor añade borde negro a cada barra.
Tercer subplot — dispersión del seno (esquina inferior derecha):
python
ax3 = fig.add_subplot(gs[1, 1])
ax3.scatter(x, y, color='red')
ax3.set_title('Dispersión de Seno')
ax3.set_xlabel('X')
ax3.set_ylabel('Seno de X')
Con gs[1, 1] se completa el cuarto cuadrante de la cuadrícula [8:30].
¿Cómo evitar la superposición entre gráficos?
Una vez definidos todos los subplots, es importante llamar a plt.tight_layout() antes de plt.show() [10:05]. Esta función ajusta automáticamente los márgenes y el espaciado para que títulos y etiquetas no se solapen:
python
plt.tight_layout()
plt.show()
¿Qué consideraciones tener al trabajar con celdas en notebooks?
Cuando trabajas en Google Colab o Jupyter, Matplotlib guarda el estado de la figura en el momento de su creación. Si defines la figura en una celda y los subplots en otra, la referencia puede perderse [10:20]. La recomendación es mantener toda la configuración y los gráficos en la misma celda para que el resultado se renderice correctamente.
El resultado final muestra un gráfico grande del seno en la parte superior y dos gráficos más pequeños en la parte inferior: el histograma a la izquierda y el scatter plot a la derecha. Ahora puedes experimentar añadiendo cuatro o más gráficos, modificando las proporciones de la cuadrícula y combinando distintos tipos de visualización. ¿Qué combinación de gráficos te resulta más útil para tus datos?
Los **subplots** y **layouts avanzados** en Matplotlib permiten crear gráficos complejos organizados en varias filas y columnas, lo que es especialmente útil cuando necesitas visualizar diferentes variables o aspectos de los datos en un solo lienzo. Aquí te mostraré cómo crear subplots y ajustar su diseño de forma eficiente.
### 1. **Creación de Subplots Básicos**
El método plt.subplot() o plt.subplots() es la base para crear múltiples gráficos en una sola figura.
#### Ejemplo básico:
import matplotlib.pyplot as plt
import numpy as np
\# Datos de ejemplo
x = np.linspace(0,10,100)y1 = np.sin(x)y2 = np.cos(x)\# Crear una figura con dos subplots (1 fila,2 columnas)fig,(ax1, ax2)= plt.subplots(1,2, figsize=(10,5))\# Gráfico 1: Seno
ax1.plot(x, y1,'r')ax1.set\_title("Seno")\# Gráfico 2: Coseno
ax2.plot(x, y2,'b')ax2.set\_title("Coseno")plt.show()
### 2. **Personalización de los Subplots**
#### Títulos, etiquetas y leyendas:
Cada subplot es un eje individual que se puede personalizar de manera independiente.
Cuando los gráficos están muy juntos, puedes ajustar el espaciado entre ellos con plt.subplots\_adjust().
#### Ejemplo:
fig,(ax1, ax2)= plt.subplots(1,2, figsize=(10,5))
\# Agregar los gráficos
ax1.plot(x, y1,'r')ax2.plot(x, y2,'b')
\# Ajustar el espaciado
plt.subplots\_adjust(wspace=0.3)# Aumentar el espacio horizontal entre subplotsplt.show()
### 4. **Crear Subplots con Diferentes Tamaños (GridSpec)**
GridSpec permite crear layouts complejos donde cada subplot puede ocupar un número variable de filas o columnas.
#### Ejemplo con GridSpec:
import matplotlib.gridspec as gridspec
\# Crear una figura
fig = plt.figure(figsize=(10,7))
\# Definir el layout con GridSpec
gs = gridspec.GridSpec(2,2, height\_ratios=\[2,1], width\_ratios=\[1,2])
\# Crear los subplots
ax1 = fig.add\_subplot(gs\[0,0])# Ocupa la primera fila y primera columnaax2 = fig.add\_subplot(gs\[0,1])# Ocupa la primera fila y segunda columnaax3 = fig.add\_subplot(gs\[1,:])# Ocupa toda la segunda fila
\# Agregar gráficos
ax1.plot(x, y1,'r')ax1.set\_title("Seno")ax2.plot(x, y2,'g')ax2.set\_title("Coseno")ax3.plot(x, y1 + y2,'b')ax3.set\_title("Suma de Seno y Coseno")plt.tight\_layout()# Ajusta los márgenes de los subplotsplt.show()
### 5. **Compartir Ejes entre Subplots**
A veces, es útil que varios subplots compartan los mismos ejes, especialmente cuando quieres comparar gráficos que tienen la misma escala.
#### Ejemplo con ejes compartidos:
fig,(ax1, ax2)= plt.subplots(1,2, figsize=(10,5), sharey=True)\# Gráfico 1: Seno
ax1.plot(x, y1,'r')ax1.set\_title("Seno")\# Gráfico 2: Coseno
ax2.plot(x, y2,'b')ax2.set\_title("Coseno")
\# Ambos subplots compartirán el mismo eje Y
plt.show()
Otra manera de manejar subplots complejos es usando subplot2grid(), lo que te permite colocar subplots en posiciones específicas dentro de una cuadrícula flexible.
#### Ejemplo:
fig = plt.figure(figsize=(10,7))
\# Crear los subplots con posiciones específicas en una cuadrícula 3x3
ax1 = plt.subplot2grid((3,3),(0,0), colspan=2)# Primer subplot abarca 2 columnasax2 = plt.subplot2grid((3,3),(0,2))# Segundo subplot en la tercera columnaax3 = plt.subplot2grid((3,3),(1,0), colspan=3)# Tercer subplot abarca toda la segunda filaax4 = plt.subplot2grid((3,3),(2,0), colspan=3)# Cuarto subplot en la última fila
\# Agregar gráficos
ax1.plot(x, y1,'r')ax1.set\_title("Seno")ax2.plot(x, y2,'g')ax2.set\_title("Coseno")ax3.plot(x, y1 + y2,'b')ax3.set\_title("Suma de Seno y Coseno")ax4.plot(x, y1 - y2,'purple')ax4.set\_title("Diferencia entre Seno y Coseno")plt.tight\_layout()plt.show()
### 7. **Uso de plt.tight\_layout() y plt.constrained\_layout()**
tight\_layout() y constrained\_layout() son útiles para ajustar los márgenes entre subplots automáticamente, asegurándose de que las etiquetas y títulos no se superpongan.
- **Subplots**: Se usan para organizar gráficos en una sola figura, ideal para comparar datos.
- **GridSpec** y **subplot2grid**: Permiten mayor control sobre el diseño de los subplots.
- **Compartir ejes**: Ayuda a mejorar la comparación entre gráficos.
- **Ajustar layouts**: Usa tight\_layout() o constrained\_layout() para evitar solapamientos entre gráficos.
Estos métodos te permitirán realizar visualizaciones más organizadas y profesionales usando subplots y layouts avanzados en Matplotlib.
Genial, te quedo muy bueno!
🟢 Qué es Figure y Axes
figure es el término general que se usa para referirse al objeto Figure en Matplotlib, que es el contenedor de todos los subgráficos y otros elementos gráficos.
axes es el objeto Axes que representa el área del gráfico dentro de la figura.
¡Nunca pares de aprender! 🚀🚀
EN RESUMEN:
Subplots permiten organizar múltiples gráficos en una sola figura para facilitar la comparación.
Layouts avanzados ofrecen una mayor flexibilidad en la disposición de los gráficos, permitiendo diseños personalizados y complejos para una visualización más efectiva.
Ejemplo:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
# 1. Preparar los datos
x = np.linspace(0, 2 * np.pi, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_quad = x**2
y_noise = np.random.randn(100)
# 2. Configurar la figura y el GridSpec (2 filas, 3 columnas para dar juego)
fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 3, figure=fig)
# 3. Crear los subplots usando slices de la rejilla
# Gráfico principal: Seno (Fila 0, todas las columnas)
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y_sin, color='blue', lw=2)
ax1.set_title('Función Seno (Principal)')
ax1.grid(True)
# Gráfico 2: Coseno (Fila 1, Columna 0)
ax2 = fig.add_subplot(gs[1, 0])
ax2.plot(x, y_cos, color='red')
ax2.set_title('Coseno')
# Gráfico 3: Cuadrática (Fila 1, Columna 1)
ax3 = fig.add_subplot(gs[1, 1])
ax3.plot(x, y_quad, color='green')
ax3.set_title('x al cuadrado')
# Gráfico 4: Ruido Aleatorio (Fila 1, Columna 2)
ax4 = fig.add_subplot(gs[1, 2])
ax4.scatter(x, y_noise, alpha=0.5, s=10)
ax4.set_title('Ruido Blanco')
# Ajustar espacio para que no se encimen los títulos
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
# 1. Preparar los datos
x = np.linspace(0, 2 * np.pi, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_quad = x**2
y_noise = np.random.randn(100)
# 2. Configurar la figura y el GridSpec (2 filas, 3 columnas para dar juego)
fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 3, figure=fig)
# 3. Crear los subplots usando slices de la rejilla
# Gráfico principal: Seno (Fila 0, todas las columnas)
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y_sin, color='blue', lw=2)
ax1.set_title('Función Seno (Principal)')
ax1.grid(True)
# Gráfico 2: Coseno (Fila 1, Columna 0)
ax2 = fig.add_subplot(gs[1, 0])
ax2.plot(x, y_cos, color='red')
ax2.set_title('Coseno')
# Gráfico 3: Cuadrática (Fila 1, Columna 1)
ax3 = fig.add_subplot(gs[1, 1])
ax3.plot(x, y_quad, color='green')
ax3.set_title('x al cuadrado')
# Gráfico 4: Ruido Aleatorio (Fila 1, Columna 2)
ax4 = fig.add_subplot(gs[1, 2])
ax4.scatter(x, y_noise, alpha=0.5, s=10)
ax4.set_title('Ruido Blanco')
# Ajustar espacio para que no se encimen los títulos
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
# 1. Preparar los datos
x = np.linspace(0, 2 * np.pi, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_quad = x**2
y_noise = np.random.randn(100)
# 2. Configurar la figura y el GridSpec (2 filas, 3 columnas para dar juego)
fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 3, figure=fig)
# 3. Crear los subplots usando slices de la rejilla
# Gráfico principal: Seno (Fila 0, todas las columnas)
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y_sin, color='blue', lw=2)
ax1.set_title('Función Seno (Principal)')
ax1.grid(True)
# Gráfico 2: Coseno (Fila 1, Columna 0)
ax2 = fig.add_subplot(gs[1, 0])
ax2.plot(x, y_cos, color='red')
ax2.set_title('Coseno')
# Gráfico 3: Cuadrática (Fila 1, Columna 1)
ax3 = fig.add_subplot(gs[1, 1])
ax3.plot(x, y_quad, color='green')
ax3.set_title('x al cuadrado')
# Gráfico 4: Ruido Aleatorio (Fila 1, Columna 2)
ax4 = fig.add_subplot(gs[1, 2])
ax4.scatter(x, y_noise, alpha=0.5, s=10)
ax4.set_title('Ruido Blanco')
# Ajustar espacio para que no se encimen los títulos
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
# 1. Preparar los datos
x = np.linspace(0, 2 * np.pi, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_quad = x**2
y_noise = np.random.randn(100)
# 2. Configurar la figura y el GridSpec (2 filas, 3 columnas para dar juego)
fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 3, figure=fig)
# 3. Crear los subplots usando slices de la rejilla
# Gráfico principal: Seno (Fila 0, todas las columnas)
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(x, y_sin, color='blue', lw=2)
ax1.set_title('Función Seno (Principal)')
ax1.grid(True)
# Gráfico 2: Coseno (Fila 1, Columna 0)
ax2 = fig.add_subplot(gs[1, 0])
ax2.plot(x, y_cos, color='red')
ax2.set_title('Coseno')
# Gráfico 3: Cuadrática (Fila 1, Columna 1)
ax3 = fig.add_subplot(gs[1, 1])
ax3.plot(x, y_quad, color='green')
ax3.set_title('x al cuadrado')
# Gráfico 4: Ruido Aleatorio (Fila 1, Columna 2)
ax4 = fig.add_subplot(gs[1, 2])
ax4.scatter(x, y_noise, alpha=0.5, s=10)
ax4.set_title('Ruido Blanco')
# Ajustar espacio para que no se encimen los títulos
plt.tight_layout()
plt.show()
SUBPLOTS
Qué son: Los subplots son múltiples gráficos (o ejes) que se muestran en una sola figura o ventana en una visualización. Permiten colocar varios gráficos en una sola imagen, organizados en una cuadrícula.
Para qué sirven: Son útiles para comparar diferentes conjuntos de datos o diferentes visualizaciones en un solo marco. Esto facilita la comparación directa de resultados y la organización de gráficos relacionados. Por ejemplo, podrías usar subplots para mostrar diferentes métricas de rendimiento en una misma visual
LAYOUTS AVANZADOS
Qué son: Los layouts avanzados se refieren a configuraciones más complejas de subplots que permiten personalizar la disposición y el tamaño de cada subplot dentro de una figura. Esto incluye configuraciones como el uso de grids con diferentes tamaños de filas y columnas, o la integración de gráficos con diferentes dimensiones o proporciones.
Para qué sirven: Permiten una mayor flexibilidad y control en la disposición de múltiples gráficos. Puedes ajustar el espacio entre subplots, combinar gráficos de diferentes tipos, o ajustar el tamaño y posición de cada gráfico según sea necesario. Esto es especialmente útil cuando se necesitan diseños complejos o cuando se quiere mostrar información en una disposición específica para mejorar la claridad y el impacto visual.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# grafica de senox = np.linspace(0,10,100)y = np.sin(x)# data randomdata = np.random.randn(100)# configuracion del figure y el gridspecfig = plt.figure(figsize=(10,6))gs = gridspec.GridSpec(2,2, height_ratios=[2,1], width_ratios=[1,1])# plot 1ax1 = fig.add_subplot(gs[0,:])ax1.plot(x, y, color='r')ax1.set_title('Senoidal')ax1.set_xlabel('x')ax1.set_ylabel('sen(x)')# plot 2ax2 = fig.add_subplot(gs[1,0])ax2.hist(data, bins=20, color='g', edgecolor='black')ax2.set_title('Histograma')ax2.set_xlabel('Valores')# plot 3ax3 = fig.add_subplot(gs[1,1])ax3.scatter(x, data, color='b')ax3.set_title('Dispersión')ax3.set_xlabel('x')# mostrar graficasplt.style.use('dark_background')plt.tight_layout()plt.show()
Tres gráficos, el primer gráfico lo hice con base en los datos del archivo online_retail.csv, aquí el código:
Muy a las apuradas, se profundiza poco y nada en las funciones de cada biblioteca
Usar GridSpec en Matplotlib es más flexible y potente que simplemente definir filas y columnas en plt.figure(). GridSpec permite crear subplots de diferentes tamaños y posiciones dentro de una grilla personalizada, lo que es especialmente útil para gráficos complejos o cuando necesitas mayor control sobre el diseño. Si solo necesitas una disposición sencilla, usar plt.figure() con filas y columnas puede ser suficiente. Sin embargo, para visualizaciones más elaboradas y organizadas, GridSpec es la opción recomendada.
Mi pequeño aporte probando cosas de la clase anterior
import matplotlib.pyplotas plt
import numpy as np
import matplotlib.gridspecas gridspec
import pandas as pd
from matplotlib.datesimportDateFormatterx = np.linspace(0,10,100)y1 = np.sin(x)y2 = np.cos(x)data = np.random.randn(100)dates = pd.date_range(start="2023-01-01", periods=100)values = np.random.rand(100).cumsum()data1 = pd.DataFrame({"Date": dates,"Value": values
})gs = gridspec.GridSpec(3,2)fig = plt.figure(figsize=(10,8))# Primer subplot
ax1 = fig.add_subplot(gs[0,:])ax1.plot(data1["Date"], data1["Value"], color ="green")ax1.xaxis.set_major_formatter(DateFormatter("%b %Y"))ax1.set_title("Serie de tiempo con formato de fechas")ax1.set_xlabel("Dates")ax1.set_ylabel("Values")# Segundo subplot
ax2 = fig.add_subplot(gs[1,0])ax2.hist(data, color="salmon", bins =20, edgecolor="black", alpha=0.6)ax2.set_title("Distribución alturas")ax2.set_xlabel("Altura (cm)")ax2.set_ylabel("Densidad")# Tercer subplot
ax3 = fig.add_subplot(gs[1,1])ax3.boxplot(data, patch_artist=True, notch=False)# Cuarto subplot
ax4 = fig.add_subplot(gs[2,0])ax4.plot(x,y1, color="blue")ax4.set_title("Seno de X")ax4.set_xlabel("x")ax4.set_ylabel("sin(x)")# Quinto subplot
ax5 = fig.add_subplot(gs[2,1])ax5.plot(x,y1, color="red")ax5.set_title("Coseno de X")ax5.set_xlabel("x")ax5.set_ylabel("cos(x)")plt.tight_layout()plt.show()```
Mi layout de las últimas gráficas relizadas (espero mejorar su estetica pronto)
# Colocar los tres ultimos datos en un gridspec
import matplotlib.gridspecas gridspec
gs = gridspec.GridSpec(2,2, height_ratios=[2,1],width_ratios=[1,1])fig = plt.figure(figsize=(10,8))
#primera piechart
labels =['Devoluciones','Ventas']sizes =[total_returns, total_sales]colors =['#ff9999','#66b3ff']pie1 = fig.add_subplot(gs[0,:])pie1.pie(sizes, labels = labels, colors = colors, autopct ='%1.1f%%', startangle =45)pie1.axis('equal')pie1.set_title('Ventas vs Devoluciones')
#distribuicon de ventas por mes y año
dis1 = fig.add_subplot(gs[1,1])data_cleaned.groupby(['Year','Month'])['TotalAmount'].sum().plot(kind ='bar', ax = dis1)dis1.set_xlabel('Year, Month')dis1.set_ylabel('Total Sales')dis1.set_title('Total Sales by Year and Month')# top 10 más vendidos
top_10_products = data_cleaned.groupby('StockCode')['Quantity'].sum().sort_values(ascending =False).head(10)top_10_products = top_10_products.reset_index()top_10_products = pd.merge(top_10_products, data_cleaned[['StockCode','Description']].drop_duplicates(), on ='StockCode', how ='left')top = fig.add_subplot(gs[1,0])top.barh(top_10_products['Description'], top_10_products['Quantity'], color ='blue')top.set_xlabel('Quantity')top.set_ylabel('Product Description')top.set_title('Top 10 Most Sold Products')
Aqui está mi aporte. Primero intenté hacer un gráfico tipo 'Pie', pero cómo se dice en mi país "me quedó grande el poncho" jajaja
Si alguien me enseña a insertar imágenes y a borrar comentarios, estaría muy agradecido
Alguien sabe como hacer que los títulos de cada gráfico se muestren? En el video solo se ve el título principal. En mi caso me parece que tengo un error en esta parte.
El problema del ejercicio es que tanto para ax2 como para ax3 se estaba omitiendo el agregarle valor a sus etiquetas ya que como fue un copy/paste en todos los pasos se estaban reescribiendo las etiquetas de ax1.
Para crear múltiples gráficos en una sola figura utilizando Matplotlib y GridSpec, aquí tienes el código con comentarios explicativos:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
# Generar un conjunto de datosx = np.linspace(0,10,100)# Crear un array de 100 puntos entre 0 y 10y_seno = np.sin(x)# Calcular el seno de cada punto en xdatos_histograma = np.random.randn(100)# Generar 100 números aleatorios# Crear una figura y definir la cuadrículafig = plt.figure(figsize=(10,8))# Tamaño de la figurags = GridSpec(2,2)# Grid de 2 filas y 2 columnas# Primer subplot: gráfico de senoax1 = fig.add_subplot(gs[0,:])# Ocupa la primera filaax1.plot(x, y_seno, color='blue')# Graficar el senoax1.set_title('Gráfico de Seno')# Título del gráfico# Segundo subplot: histogramaax2 = fig.add_subplot(gs[1,0])# Ocupa la esquina inferior izquierdaax2.hist(datos_histograma, bins=20, color='purple')# Crear histogramaax2.set_title('Histograma')# Título del histograma# Tercer subplot: gráfico de dispersiónax3 = fig.add_subplot(gs[1,1])# Ocupa la esquina inferior derechaax3.scatter(x, y_seno, color='red')# Graficar dispersiónax3.set_title('Dispersión de Seno')# Título del gráfico de dispersión# Ajustar el layout y mostrar la figuraplt.tight_layout()# Ajustar layout para evitar superposicionesplt.show()# Mostrar la figura
Este código te permite visualizar tres tipos diferentes de gráficos en una sola figura utilizando Matplotlib.