Añadir / crear subplots dinámicamente en matplotlib

Quiero crear un gráfico que consta de varias subplots con ejes x / y compartidos. Debería verse algo así en la documentación (aunque mis subplots serán scatterblots): (codifique aquí)

3 subparcelas compartiendo ejes xey

¡Pero quiero crear las subplots dinámicamente!

Por lo tanto, el número de subplots depende de la salida de una función anterior. (Probablemente será alrededor de 3 a 15 subplots por diagtwig, cada uno de un conjunto de datos distinto, según la entrada de mi script)

¿Alguien puede decirme cómo lograr eso?

 import matplotlib.pyplot as plt from pylab import * import numpy as np x = np.linspace(0, 2*np.pi, 400) y = np.sin(x**2) subplots_adjust(hspace=0.000) number_of_subplots=3 for i,v in enumerate(xrange(number_of_subplots)): v = v+1 ax1 = subplot(number_of_subplots,1,v) ax1.plot(x,y) plt.show() 

Este código funciona pero necesitarás corregir los ejes. Solía ​​hacer una subplot para trazar 3 gráficos, todos en la misma columna. Todo lo que necesita hacer es asignar un número entero a la variable number_of_plots . Si los valores de X e Y son diferentes para cada gráfico, deberá asignarlos a cada gráfico.

subplot funciona de la siguiente manera, si, por ejemplo, yo tuviera una subplot de valores de 3,1,1 . Esto crea una cuadrícula de 3×1 y coloca el gráfico en la primera posición. En la siguiente información, si los valores de mi subplot fueran 3,1,2 , nuevamente se crea una cuadrícula de 3×1, pero se coloca la plot en la 2ª posición y así sucesivamente.

Basado en esta publicación , lo que quieres hacer es algo como esto:

 import matplotlib.pyplot as plt # Start with one fig = plt.figure() ax = fig.add_subplot(111) ax.plot([1,2,3]) # Now later you get a new subplot; change the geometry of the existing n = len(fig.axes) for i in range(n): fig.axes[i].change_geometry(n+1, 1, i+1) # Add the new ax = fig.add_subplot(n+1, 1, n+1) ax.plot([4,5,6]) plt.show() 

Sin embargo, la respuesta de Paul H apunta al submódulo llamado gridspec que podría hacer que lo anterior sea más fácil. Lo dejo como un ejercicio para el lector ^ _ ~.

Supongamos que conoce las subplotaciones totales y las columnas totales que desea usar:

 import matlab.pyplot as plt # Subplots are organized in a Rows x Cols Grid # Tot and Cols are known Tot = number_of_subplots Cols = number_of_columns # Compute Rows required Rows = Tot // Cols Rows += Tot % Cols # Create a Position index Position = range(1,Tot + 1) 

La primera instancia de las cuentas de filas solo para las filas completamente llenas por subplots, luego se agrega una fila más si 1 o 2 o … Cols – 1 subplots aún necesitan ubicación.

A continuación, cree la figura y agregue subplots con un bucle for .

 # Create main figure fig = plt.figure(1) for k in range(Tot): # add every single subplot to the figure with a for loop ax = fig.add_subplot(Rows,Cols,Position[k]) ax.plot(x,y) # Or whatever you want in the subplot plt.show() 

Tenga en cuenta que necesita la Posición de rango para mover las subplots al lugar correcto.

En lugar de contar su propio número de filas y columnas, me resultó más fácil crear las subplots usando plt.subplots primero, luego iterar a través del objeto de ejes para agregar plots.

 import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 8)) x_array = np.random.randn(6, 10) y_array = np.random.randn(6, 10) i = 0 for row in axes: for ax in row: x = x_array[i] y = y_array[i] ax.scatter(x, y) ax.set_title("Plot " + str(i)) i += 1 plt.tight_layout() plt.show() 

Aquí utilizo i para iterar a través de elementos de x_array y y_array , pero también puede iterar fácilmente a través de funciones, o columnas de marcos de datos para generar gráficamente dinámicamente.