2011-08-18 12 views
15

Entonces, en un figure donde se han agregado tres subtramas verticales con add_subplot, ¿cómo puedo seleccionar digamos la del medio?¿Cómo puedo seleccionar mediante programación una subtrama específica en Matplotlib?

Ahora mismo esta lista por comprensión:

[r[0] for r in sorted([[ax, ax.get_geometry()[2]] for ax in self.figure.get_axes()], key=itemgetter(1))]

donde yo puedo simplemente seleccionar el índice que quiero, con el correspondiente axes. ¿Hay una manera más directa de hacer esto?

Respuesta

14

Desde el matplotlib documentation:

Si la figura ya tiene una subtrama con la clave (args, kwargs), entonces simplemente hará que la subtrama actual y lo devuelve.

He aquí un ejemplo:

import matplotlib.pyplot as plt 

fig = plt.figure() 
for vplot in [1,2,3]: 
    ax = fig.add_subplot(3,1,vplot) 
    ax.plot(range(10),range(10)) 

ax_again = fig.add_subplot(3,1,2) 
ax_again.annotate("The middle one",xy=(7,5),xytext=(7,5)) 

plt.show() 

La trama central se llama de nuevo para que pueda ser anotada.

¿Qué pasa si configuro el fondo con mi llamada original, tengo que volver a configurarlo cuando obtengo la subtrama por segunda vez?

Sí. Los argumentos y las palabras clave de la llamada original se utilizan para crear un identificador único. Entonces, para que la figura genere este identificador único de nuevo, debe pasar los mismos argumentos (definición de cuadrícula, posición) y palabras clave nuevamente. Por ejemplo:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(2,1,1,axisbg='red') 
ax.plot(range(10),range(10)) 
ax = fig.add_subplot(2,1,2) 
ax.plot(range(10),range(10)) 

ax_again = fig.add_subplot(2,1,1,axisbg='red') 
ax_again.annotate("The top one",xy=(7,5),xytext=(7,5)) 

plt.show() 

Qué pasa si usoax_again.change_geometry()?

Pensarías change_geometry, p. de un 312 a un 422, cambiaría la forma en que usa add_subplot, pero no es así. Parece que hay un error o un comportamiento indefinido cuando llamas a change_geometry. La clave única que se generó originalmente utilizando los argumentos y las palabras clave, a la primera llamada add_subplot, no se actualiza. Por lo tanto, si desea recuperar un eje con una llamada add_subplot, debe llamar a add_subplot con los argumentos y palabras clave originales. Para obtener más información, siga este informe emisión: https://github.com/matplotlib/matplotlib/issues/429

Mi conjetura por ahora es que si cambia cualquier propiedad de la trama secundaria después de generar con la llamada add_subplot, la única no se ajustará. Entonces use los argumentos y palabras clave originales, y con suerte esto funcionará.

+3

Hombre He pasado horas vertiendo a través de esos documentos, pero aún logré pasar por alto esa parte vital. Gracias – c00kiemonster

+1

Ojalá entendiera matplotlib al revés. Definitivamente haría mi trabajo más fácil. También me llevó un tiempo, y definitivamente no es fácil desentrañar estos detalles de los documentos. Estoy tratando de ver si pasas kwargs en la llamada inicial, ¿tienes que pasarlos exactamente igual la segunda vez, como sugieren los documentos? Actualizaré las cosas si encuentro algo. – Yann

+1

Así que resulta que la clase de figura tiene una función de miembro privado _make_key que '(hace) una clave de hash out de args y kwargs'; esto se usa para identificar la subtrama (y supongo que todos los ejes pertenecen a una figura). Entonces, sí, necesita usar con precisión los mismos argumentos y palabras clave. – Yann

Cuestiones relacionadas