2013-01-10 4 views
11

Zuvor hatte ich ein Problem mit der interference between multiple Matplotlib figures. Schließlich wurde ich auf ein Problem aufmerksam gemacht, das einige pyplot-Funktionen nicht an ihre Figur-Instanz anhängen, sondern in einigen anderen Figuren-Instanzen gerendert werden können, die parallel erzeugt werden. HierWie kann ich einer Figurinstanz eine Pyplot-Funktion hinzufügen?

ist einiger Beispiel-Code:

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 

Die Kontur pyplot Funktion in dem obigen Beispiel kann in fig1 gemacht, aber gelegentlich auch in anderer Gestalt, die parallel erzeugt wird. Das ist sehr ärgerlich. Gibt es eine Möglichkeit, die Kontur-Pyplot-Funktion an fig1 anzuhängen?

Antwort

12

Sie eine subplot erstellen und als die contour Methode des subplot nennen:

fig1 = figure(figsize=(4, 4), facecolor='white') 
ax = fig1.add_subplot(111) 
ax.contour(X, Y, Z) 

plt.subplots macht es bequem, eine Figur und Nebenhandlungen mit einem einzigen Aufruf zu erstellen:

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
+0

Dies ist eine perfekte Antwort: Funktioniert wie ein Zauber und ich brauche nur die drei Zeichen "Axt" zu meiner Codebasis hinzuzufügen. Vielen Dank! – Meilo

+0

danke. Wenn es "perfekt" ist, könntest du darüber nachdenken, es zu verbessern ;-). – bmu

+0

Danke für die Antwort, sehr nützlich. –

20

Als ein bisschen Erklärung, was hier passiert, hat matplotlib zwei semi-unabhängige Schnittstellen; die Zustandsmaschine und die OO-Schnittstelle.

Der Status-Maschinencode wurde für die Arbeit in einer interaktiven Shell entwickelt (und imitiert die Matlab-Schnittstelle). Dies geschieht, indem die OO-Schnittstelle in eine Gruppe von Befehlen eingeschlossen wird, die verfolgen, was die aktuellen figure und axes sind. Wenn Sie den Befehl von matplotlib.pyplot verwenden (ich vermute, Sie haben eine from matploblib.pyplot import * in Ihrem Code) in entspricht mehr oder weniger zu tun gcf().gca().contour(...). Wenn Sie eine neue Figur erstellen, wird diese automatisch aktualisiert (was Sie wünschen, wenn Sie dies in einer iterativen Shell verwenden), so dass das Verhalten, das Sie sehen, das "richtige" Verhalten ist. Die State-Machine-Schnittstelle enthält auch Code, um sicherzustellen, dass Figuren bei Bedarf neu gezeichnet werden, um die GUI-Ereignisschleifen zu verwalten (alles, was Sie tun müssen, damit die interaktive Oberfläche reibungslos funktioniert). Wie in den Kommentaren von hayden erwähnt, läuft ipython --pylab automatisch from matplotlib.pyplot import *, was Ihnen eine sehr schöne interaktive Shell gibt.

Die OO-Schnittstelle ist für den programmatischen Umgang mit matplotlib ausgelegt. Was es in der Ausführlichkeit hinzufügt (Sie müssen jetzt die meiste Arbeit der Staatsmaschine erledigen), gleicht es in Klarheit aus. Im OO-Modell, die meisten (vielleicht alle) der Plotten Funktionen sind mit Axes Objekten zugeordnet (doc) (wie es mit einer Figur (ex zugeordnet subplots mit gridspec) mehr als eine Achse sein kann.

Ein alternativer Weg zu Ihr Problem ist

ax = fig1.gca() 

, welche die aktuellen Achsen von fig1 greifen wird, ein, wenn nötig zu schaffen. Dies kann hilfreich sein, wenn Sie den Überblick über Ihre Figur Objekte halten, aber nicht Ihre Achsen Objekte und andere Graphen hinzugefügt werden sollen die Zahl

+0

Danke, das hat mir geholfen, das Problem zu verstehen! – Meilo

+0

erwähnenswert running 'ipython --pylab' beinhaltet' from matplablib.pyplot import * ' –

Verwandte Themen