python - multiple - ¿Cómo puedo adjuntar una función pyplot a una instancia de figura?
pyplot figure (2)
Como un poco de explicación de lo que está sucediendo aquí, matplotlib
tiene dos interfaces semi-independientes; la máquina de estado y la interfaz OO.
El código de máquina de estado está diseñado para trabajar en un shell interactivo (e imita la interfaz de matlab). Lo hace envolviendo la interfaz OO en un conjunto de comandos que hacen un seguimiento de lo que son la figure
y los axes
actuales. Cuando utilizas el comando de matplotlib.pyplot
(sospecho que tienes una from matploblib.pyplot import *
en tu código) en es más o menos equivalente a hacer gcf().gca().contour(...)
. Cuando creas una nueva figura, se actualiza automáticamente (que es lo que quieres si estás usando esto en un shell iteractivo), por lo que el comportamiento que ves es el comportamiento "correcto". La interfaz de máquina de estado también tiene código para asegurarse de que las figuras se vuelvan a dibujar cuando lo necesiten, administrar los bucles de eventos de GUI, etc. (todo lo que necesita hacer para que la interfaz interactiva funcione sin problemas). Como hayden mencionó en los comentarios, ejecutar ipython --pylab
se ejecutará automáticamente from matplotlib.pyplot import *
, que le ofrece un shell interactivo muy agradable.
La interfaz OO está diseñada para el manejo programático de matplotlib
. Lo que agrega en la verbosidad (ahora tiene que hacer la mayor parte del trabajo de la máquina de estado), lo compensa en claridad. En el modelo OO, la mayoría (tal vez todas) de las funciones de trazado están asociadas con objetos Axes
( doc ) (ya que puede haber más de un eje asociado con una figura (ej. gridspec
usando gridspec
).
Una forma alternativa de resolver su problema es
ax = fig1.gca()
que tomará los ejes actuales de la fig1
, creando uno si es necesario. Esto puede ser útil si realiza un seguimiento de los objetos de su figura, pero no de los ejes, y desea agregar otro gráfico a la figura.
Previamente, tuve un problema con la interferencia entre varias figuras de Matplotlib . Finalmente me enteré de que se trata de un problema que algunas funciones de gráfico de parásitos no se asocian a su instancia de figura pero que se pueden representar en otras instancias de figuras que se crean en paralelo.
Aquí hay un código de ejemplo:
from django.http import HttpResponse
from numpy import arange, meshgrid
from matplotlib.mlab import bivariate_normal
def show_chart(request):
delta = 0.025
x = arange(-3.0, 3.0, delta)
y = arange(-2.0, 2.0, delta)
X, Y = meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10.0 * (Z2 - Z1)
from matplotlib.pyplot import figure, contour
fig1 = figure(figsize=(4, 4), facecolor=''white'')
contour(X, Y, Z)
response = HttpResponse(content_type=''image/png'')
fig1.savefig(response, format=''png'')
fig1.clear()
return response
La función pyplot de contorno en el ejemplo anterior puede renderizarse en fig1, pero ocasionalmente también en otra figura que se genera en paralelo. Eso es muy molesto ¿Hay alguna forma de adjuntar la función de contorno pyplot a fig1?
Puede crear una subtrama y llamar al método de contour
de la subparcela:
fig1 = figure(figsize=(4, 4), facecolor=''white'')
ax = fig1.add_subplot(111)
ax.contour(X, Y, Z)
plt.subplots
hace que sea conveniente crear una figura y subtramas con una sola llamada:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()