2011-09-24 64 views
2

我想離開matlab並改用python + matplotlib。但是,我還沒有真正弄清matlab'handles'的matplotlib等價物是什麼。所以這裏有一些matlab代碼,我返回句柄,以便我可以改變某些屬性。這段代碼使用matplotlib的確切等價物是什麼?我經常在matlab中使用句柄的'Tag'屬性,並使用'findobj'。這可以用matplotlib來完成嗎?這個matlab代碼相應的matplotlib代碼是什麼

% create figure and return figure handle 
h = figure(); 
% add a plot and tag it so we can find the handle later 
plot(1:10, 1:10, 'Tag', 'dummy') 
% add a legend 
my_legend = legend('a line') 
% change figure name 
set(h, 'name', 'myfigure') 
% find current axes 
my_axis = gca(); 
% change xlimits 
set(my_axis, 'XLim', [0 5]) 
% find the plot object generated above and modify YData 
set(findobj('Tag', 'dummy'), 'YData', repmat(10, 1, 10)) 

回答

4

有一個findobj方法matplotlib太:

import matplotlib.pyplot as plt 
import numpy as np 

h = plt.figure() 
plt.plot(range(1,11), range(1,11), gid='dummy') 
my_legend = plt.legend(['a line']) 
plt.title('myfigure') # not sure if this is the same as set(h, 'name', 'myfigure') 
my_axis = plt.gca() 
my_axis.set_xlim(0,5) 
for p in set(h.findobj(lambda x: x.get_gid()=='dummy')): 
    p.set_ydata(np.ones(10)*10.0) 
plt.show() 

注意,在plt.plotgid參數通常使用matplotlib(僅)當後端被設置爲 'SVG'。它使用gid作爲id屬性給一些分組元素(如line2d,patch,text)。

+0

太棒了! matplotlib中的'gid'屬性也類似於matlab中的'Tag'屬性,即它是否存在於任何類型的對象(圖形,繪圖,圖例)中。 – memyself

+0

不,「plt.figure」和「plt.legend」不接受'gid'參數。如果您需要跟蹤一般對象組,則可以更容易地使用從「虛擬」標籤名稱映射到對象列表的字典。那麼你也不需要依賴'matplotlib'的'findobj'。 – unutbu

+0

但在這種情況下,我需要始終在某處存儲對象列表。這就是findobj的美妙之處 - 我可以找到不長在一起的對象,而且我不需要明確地保存這些對象(並將它們傳遞給它們)。 – memyself

0

我沒有使用MATLAB,但我認爲這是你想要的

import matplotlib 
import matplotlib.pyplot as plt 

x = [1,3,4,5,6] 
y = [1,9,16,25,36] 
fig = plt.figure() 
ax = fig.add_subplot(111) # add a plot 
ax.set_title('y = x^2') 
line1, = ax.plot(x, y, 'o-')  #x1,y1 are lists(equal size) 
line1.set_ydata(y2)    #Use this to modify Ydata 
plt.show() 

當然,這僅僅是一個基本的情節,還有更多的it.Go雖然this找到圖你想要查看它的源代碼。

+0

一旦你繪製了它們,你就不會修改YData。如果matplotlib中不存在「findobj」等價物,那麼我希望看到如何以不同的方式做到這一點。謝謝! – memyself

+0

看到我編輯的答案 – vivek

+0

只是一個補充:如果你想動態地更新ydata(如交互模式或動畫),你必須通過調用draw()函數刷新set_ydata()後的圖形。 – subhacom

0
# create figure and return figure handle 
h = figure() 

# add a plot but tagging like matlab is not available here. But you can 
# set one of the attributes to find it later. url seems harmless to modify. 
# plot() returns a list of Line2D instances which you can store in a variable 
p = plot(arange(1,11), arange(1,11), url='my_tag') 

# add a legend 
my_legend = legend(p,('a line',)) 
# you could also do 
# p = plot(arange(1,11), arange(1,11), label='a line', url='my_tag') 
# legend() 
# or 
# p[0].set_label('a line') 
# legend() 

# change figure name: not sure what this is for. 
# set(h, 'name', 'myfigure') 

# find current axes 
my_axis = gca() 
# change xlimits 
my_axis.set_xlim(0, 5) 
# You could compress the above two lines of code into: 
# xlim(start, end) 

# find the plot object generated above and modify YData 
# findobj in matplotlib needs you to write a boolean function to 
# match selection criteria. 
# Here we use a lambda function to return only Line2D objects 
# with the url property set to 'my_tag' 
q = h.findobj(lambda x: isinstance(x, Line2D) and x.get_url() == 'my_tag') 

# findobj returns duplicate objects in the list. We can take the first entry. 
q[0].set_ydata(ones(10)*10.0) 

# now refresh the figure 
draw() 
+0

如果你安裝了ipython,它具有特殊的matplotlib支持,你可以像matlab(使用tab-key-autocompletion)交互地使用它。運行:ipython -pylab – subhacom

+0

如果像標籤matlab不可用,我可以標記(和查找)不同的對象? – memyself

+0

是的,我剛剛更新了答案。並且在這裏,您可以根據需要在搜索條件中添加複雜度(超出標記的範圍)。 – subhacom