2009-09-11 5 views
11

J'ai une question de suivi à ce question.Python avec matplotlib - réutilisation des fonctions de dessin

Est-il possible de rationaliser la génération de figures en ayant plusieurs scripts Python qui fonctionnent sur différentes parties de la figure?

Par exemple, si je possède les fonctions suivantes:

fonctionn: Dessiner un histogramme de quelque chose
FunctionB: Dessiner une boîte avec un texte dans ce
FunctionC: Dessiner une parcelle de quelque chose C
FonctionD: Dessiner un tracé de quelque chose D

Comment puis-je réutiliser les fonctions ci-dessus dans différents scripts? Si je voulais, par exemple, créer une figure avec un histogramme avec un tracé de quelque chose C, j'appellerais en quelque sorte FunctionA et FunctionC de mon script. Ou, si je voulais une figure avec les deux graphiques, j'appellerais FunctionC et FunctionD. Je ne suis pas sûr si je m'explique clairement, mais une autre façon de poser cette question est la suivante: comment puis-je passer un objet figure à une fonction et ensuite avoir la fonction dessiner quelque chose à l'objet chiffre transmis et puis le retourner au script principal pour ajouter d'autres choses comme le titre ou quelque chose?

Répondre

8

Vous voulez utiliser le Artist objects, et de les transmettre au besoin aux fonctions:

import numpy as np 
import matplotlib.pyplot as plt 

def myhist(ax, color): 
    ax.hist(np.log(np.arange(1, 10, .1)), facecolor=color) 

def say_something(ax, words): 
    t = ax.text(.2, 20., words) 
    make_a_dim_yellow_bbox(t) 

def make_a_dim_yellow_bbox(txt): 
    txt.set_bbox(dict(facecolor='yellow', alpha=.2)) 

fig = plt.figure() 
ax0 = fig.add_subplot(1,2,1) 
ax1 = fig.add_subplot(1,2,2) 

myhist(ax0, 'blue') 
myhist(ax1, 'green') 

say_something(ax0, 'this is the blue plot') 
say_something(ax1, 'this is the green plot') 

plt.show() 

alt text http://i28.tinypic.com/2i6f7f5.png

+0

@ tom10 - Merci! Comment formater le code comme ça? – aspade

+0

De rien! Pour mettre en forme le code, indentez le bloc de code entier de quatre espaces supplémentaires et utilisez des espaces au lieu des onglets dans votre code. Il y a plus sur le formatage ici: http://stackoverflow.com/editing-help – tom10

+0

Pourquoi 'myhist()' et 'say_something()' ne doivent pas renvoyer 'ax' dans l'espace de nom externe? – crypdick

0

Okey, j'ai compris comment faire. C'était beaucoup plus simple que ce que j'avais imaginé. Il a juste fallu un peu de lecture here avec les classes figure et axes.

Dans votre script principal:

import pylab as plt 
import DrawFns 
fig = plt.figure() 
(do something with fig) 
DrawFns.WriteText(fig, 'Testing') 
plt.show() 

Dans votre DrawFns.py:

def WriteText(_fig, _text): 
[indent]_fig.text(0, 0, _text) 

Et voilà! Et je peux ajouter plus de fonctions dans DrawFns.py et les appeler à partir de n'importe quel script tant qu'ils sont inclus avec import appel. : D

+0

Ceci est la bonne idée, sauf généralement la figure contient un ou plusieurs axes et la plus grande partie de l'action consiste à appeler les méthodes des axes pour faire vos tracés, donc il est plus facile de faire la figure, puis les axes, et de passer les axes (ou un objet à l'intérieur) aux fonctions. Voir ma réponse pour un exemple. – tom10

+0

Désolé, je viens de voir ça. Merci pour le conseil. Je vais changer le code en conséquence (hors ligne). Je vous remercie! – aspade

Questions connexes