2009-09-11 11 views
11

Mam pytanie uzupełniające do tego question.Python z matplotlib - ponowne używanie funkcji rysowania

Czy możliwe jest usprawnienie generowania figur poprzez posiadanie wielu skryptów pythonowych działających na różnych częściach rysunku?

Na przykład, jeśli mam następujące funkcje:

funkcjonalnie urządzonych: Narysuj histogram coś
FunctionB: Narysuj pole z tekstem w nim
FunctionC: Narysuj wykres czegoś C
FunctionD: Narysuj wykres czegoś D

Jak mogę użyć powyższych funkcji w różnych skryptach? Gdybym na przykład chciał stworzyć postać z histogramem z działką o treści C, w jakiś sposób zadzwoniłbym do FunctionA i FunctionC z mojego skryptu. Lub, gdybym chciał postać z dwoma działkami, nazwałbym FunctionC i FunctionD.

Nie jestem pewien, czy jestem tłumacząc sobie jasno, ale inny sposób z tym pytaniem jest to: w jaki sposób przekazać obiekt rysunek do funkcji i wtedy funkcja narysować coś do figury i przeszedł obiektu następnie powrócić do głównego skryptu, aby dodać inne rzeczy, takie jak tytuł lub coś takiego?

Odpowiedz

8

Tutaj chcesz użyć Artist objects, i przekazać je za potrzebne do funkcji:

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 - Dzięki! Jak formatujesz taki kod? – aspade

+0

Nie ma za co! Aby sformatować kod, wcń cały blok kodu o cztery dodatkowe spacje i użyj spacji zamiast kart w kodzie. Tu jest coś więcej na temat formatowania: http://stackoverflow.com/editing-help – tom10

+0

Dlaczego 'myhist()' i 'say_something()' nie muszą zwracać 'siekiery' z powrotem do zewnętrznej przestrzeni nazw? – crypdick

0

Okey, wymyśliłem, jak to zrobić. To było o wiele prostsze niż to, co sobie wyobrażałem. Wymagało tylko trochę czytania here z klasami figure i axes.

w głównym skrypcie:

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

W swojej DrawFns.py:

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

I to jest to! I mogę dodać więcej funkcji w DrawFns.py i wywołać je z dowolnego skryptu, o ile są one zawarte w rozmowie import. : D

+0

To jest dobry pomysł, z wyjątkiem ogólnie postać zawiera jeden lub więcej osi i większość akcji polega na wywoływaniu metod osi do tworzenia wykresów, więc łatwiej jest wykonać figurę, a następnie osie i przekazać osie (lub jakiś obiekt w nich) funkcjom. Zobacz moją odpowiedź na przykład. – tom10

+0

Przepraszam, właśnie to zobaczyłem. Dzięki za wskazówkę. Zmienię odpowiednio kod (offline). Dziękuję Ci! – aspade

Powiązane problemy