Eugenio Condori
Ignacio Robles
Genial, te quedo muy bueno!
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]:
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).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]:
python gs = gridspec.GridSpec(2, 2, height_ratios=[2, 1], width_ratios=[1, 1]) fig = plt.figure(figsize=(10, 8))
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):
python ax2 = fig.add_subplot(gs[1, 0]) ax2.hist(datos, bins=20, color='purple', edgecolor='black') ax2.set_title('Histograma') ax2.set_xlabel('Valor') ax2.set_ylabel('Frecuencia')
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.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5)) \# Gráfico 1: Seno ax1.plot(x, y1, 'r') ax1.set\_title("Seno") ax1.set\_xlabel("Tiempo") ax1.set\_ylabel("Amplitud") \# Gráfico 2: Coseno ax2.plot(x, y2, 'b') ax2.set\_title("Coseno") ax2.set\_xlabel("Tiempo") ax2.set\_ylabel("Amplitud") plt.show()
### 3. **Ajuste del Espaciado entre Subplots**
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 subplots plt.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 columna ax2 = fig.add\_subplot(gs\[0, 1]) # Ocupa la primera fila y segunda columna ax3 = 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 subplots plt.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()
### 6. **Layouts Complejos usando plt.subplot2grid()**
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 columnas ax2 = plt.subplot2grid((3, 3), (0, 2)) # Segundo subplot en la tercera columna ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=3) # Tercer subplot abarca toda la segunda fila ax4 = 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.
#### Ejemplo:
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(12, 4)) \# Agregar gráficos ax1.plot(x, y1, 'r') ax2.plot(x, y2, 'g') ax3.plot(x, y1 + y2, 'b') \# Ajustar automáticamente los márgenes plt.tight\_layout() # o plt.constrained\_layout() plt.show()
### Resumen:
- **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.
Eugenio Condori
Ignacio Robles
Genial, te quedo muy bueno!
Marina Barraza
EN RESUMEN:
NESTOR IVAN RONCANCIO CABALLERO
Libardo Gutierrez Robayo
Cristian Mateo Velez Duran
Ejemplo:
Sebastián Alejandro Arce García
Humberto Cruz
Saul Antonio Cerén Gálvez
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()
Marina Barraza
SUBPLOTS
Marina Barraza
LAYOUTS AVANZADOS
Jhon Alexander Mosquera Vanegas
Lo que GridSpec permite, más que ahorrar figuras, es decidir qué merece más espacio. En el ejemplo de la clase, el primer gráfico ocupa toda la fila superior y los otros dos comparten la fila de abajo, con una proporción de alturas de dos a uno. Esa jerarquía visual es útil al presentar resultados: el indicador principal, por ejemplo la evolución mensual de un gasto, va grande, y los gráficos de apoyo, como una distribución o una dispersión, quedan debajo. Así, quien ve la figura sabe por dónde empezar a leer sin necesitar una explicación previa.
Daniel Urango
Las cree con un dataset propio.
Me falta arreglar las etiquetas del eje x porque son muchos valores y se amontonan.
Juan Silva
Tres gráficos, el primer gráfico lo hice con base en los datos del archivo online_retail.csv, aquí el código:
# Ajustar en el lienzo
ax3 = fig.add_subplot(gs[0,:])
ax3.plot(monthly_df['InvoiceDate'],
monthly_df['Total_Sales'],
marker='o',
linestyle= '-', label='Monthly sales'
)
plt.gca().xaxis.set_major_formatter(DateFormatter('%b %Y'))
ax3.set_title('Análisis de ventas mensuales', fontsize=15, fontweight='bold')
ax3.set_xlabel('Dates', fontsize=10, fontweight='bold')
ax3.set_ylabel('Sales', fontsize=10, fontweight='bold')
Alexander Ramirez
Muy a las apuradas, se profundiza poco y nada en las funciones de cada biblioteca
Victor Matias Marquez
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.
Freddy Javier E. Pérez Zelada
gabriel concepcion
Ignacio Robles
Ignacio Robles
import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # grafica de seno x = np.linspace(0, 10, 100) y = np.sin(x) # data random data = np.random.randn(100) # configuracion del figure y el gridspec fig = plt.figure(figsize=(10, 6)) gs = gridspec.GridSpec(2, 2, height_ratios= [2, 1], width_ratios= [1,1]) # plot 1 ax1 = 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 2 ax2 = fig.add_subplot(gs[1, 0]) ax2.hist(data, bins= 20, color= 'g', edgecolor= 'black') ax2.set_title('Histograma') ax2.set_xlabel('Valores') # plot 3 ax3 = fig.add_subplot(gs[1, 1]) ax3.scatter(x, data, color= 'b') ax3.set_title('Dispersión') ax3.set_xlabel('x') # mostrar graficas plt.style.use('dark_background') plt.tight_layout() plt.show()
Mi pequeño aporte probando cosas de la clase anterior
import matplotlib.pyplot as plt import numpy as np import matplotlib.gridspec as gridspec import pandas as pd from matplotlib.dates import DateFormatter x = 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.gridspec as 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')