2009-09-11 46 views
11

我有一個跟進的問題這個question用Python matplotlib - 再利用繪圖功能

是否有可能通過具有圖上的不同部分工作的多個Python腳本,以簡化數字一代?

舉例來說,如果我有以下功能:

泛函:畫的東西
FunctionB直方圖:在裏面畫一個框,文本
FunctionC:畫的東西曲線C
功能D:畫出一些東西D

如何在不同腳本中重複使用上述功能?例如,如果我想要創建一個帶有C圖的直方圖的圖形,我會以某種方式從我的腳本中調用FunctionA和FunctionC。或者,如果我想要一個具有兩個圖的圖,我會調用FunctionC和FunctionD。

我不知道如果我解釋清楚我自己,而是問這個問題的另一種方式是這樣的:我怎麼通過一個圖形對象的功能,然後讓函數畫的東西傳遞的數字對象,然後將其返回到主腳本以添加其他內容,如標題或其他內容?

回答

8

在這裏,您要使用的Artist objects,並根據需要的功能通過他們:

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 - 謝謝!你如何格式化代碼? – aspade 2009-09-12 02:24:46

+0

不客氣!要格式化代碼,請將整個代碼塊縮進四個額外的空格,並在代碼中使用空格而不是製表符。還有更多關於格式化這裏:http://stackoverflow.com/editing-help – tom10 2009-09-12 03:07:21

+0

爲什麼不'myhist()'和'say_something()'已經返回'ax'回外的命名空間? – crypdick 2015-11-11 05:03:21

0

歐凱,我已經找到了如何做到這一點。這比我想象的要簡單得多。它只需要一點點閱讀herefigureaxes類。

在主腳本:

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

在你DrawFns.py:

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

就是這樣!我可以在DrawFns.py中添加更多的函數,只要它們包含在import調用中,就可以從任何腳本調用它們。 :d

+0

這是正確的想法,除了一般的數字包含一個或多個軸和大部分操作是調用軸方法來繪製圖形,因此,更容易製作圖形,然後製作軸,並將軸(或其中的某個對象)傳遞到函數。以我的答案爲例。 – tom10 2009-09-12 01:02:01

+0

對不起,我剛看到這個。謝謝你的提示。我會相應地更改代碼(離線)。謝謝! – aspade 2009-09-12 02:45:01