several - plot title python




Comment est-ce que je peux attacher une fonction de pyplot à une instance de chiffre? (2)

Comme un peu d'explication de ce qui se passe ici, matplotlib a deux interfaces semi-indépendantes; la machine d'état et l'interface OO.

Le code machine d'état est conçu pour fonctionner dans un shell interactif (et imite l'interface de matlab). Il le fait en enveloppant l'interface OO dans un ensemble de commandes qui gardent une trace de ce que sont la figure et les axes actuels. Lorsque vous utilisez la commande de matplotlib.pyplot (je suppose que vous avez un from matploblib.pyplot import * dans votre code) in est plus ou moins équivalent à faire gcf().gca().contour(...) . Lorsque vous créez une nouvelle figure, elle est automatiquement mise à jour (ce que vous voulez si vous l'utilisez dans un shell itératif), de sorte que le comportement que vous voyez est le comportement «correct». L'interface de la machine d'état contient également du code pour s'assurer que les figures sont redessinées quand elles en ont besoin, pour gérer les boucles d'événements gui, etc. (tout ce que vous devez faire pour que l'interface interactive fonctionne correctement). Comme mentionné dans les commentaires de ipython --pylab , l'exécution de ipython --pylab sera automatiquement exécutée à from matplotlib.pyplot import * , ce qui vous donne un très bon shell interactif.

L'interface OO est conçue pour le traitement programmatique de matplotlib . Ce qu'il ajoute dans la verbosité (vous devez maintenant faire la plupart du travail de la machine d'état), il compense dans la clarté. Dans le modèle OO, la plupart (peut-être toutes) des fonctions de traçage sont associées aux objets Axes ( doc ) (car il peut y avoir plusieurs axes associés à une figure (ex- sous- gridspec utilisant gridspec ).

Une autre façon de résoudre votre problème est

ax = fig1.gca()

qui va saisir les axes actuels de fig1 , en en créant un si nécessaire. Cela peut être utile si vous gardez la trace de vos objets, mais pas vos objets d'axes et que vous voulez ajouter un autre graphique à la figure.

Auparavant, j'avais un problème avec l' interférence entre plusieurs figures Matplotlib . Finalement, j'ai été suivi d'un problème que certaines fonctions de pyplot n'attachent pas à leur instance de figure mais peuvent être restituées dans d'autres instances de figures créées en parallèle.

Voici un exemple de 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

La fonction de contour de pyplot dans l'exemple ci-dessus peut être rendue dans fig1, mais parfois aussi dans une autre figure qui est générée en parallèle. C'est très agaçant. Est-il possible de joindre la fonction de contour de pyplot à fig1?


Vous pouvez créer une sous-parcelle et ensuite appeler la méthode de contour de la sous-parcelle:

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

plt.subplots permet de créer une figure et des sous-placettes avec un seul appel:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()






matplotlib