开发者

what is the corresponding matplotlib code of this matlab code

开发者 https://www.devze.com 2023-04-07 11:11 出处:网络
I\'m trying to go away 开发者_如何学编程from matlab and use python + matplotlib instead. However, I haven\'t really figured out what the matplotlib equivalent of matlab \'handles\' is. So here\'s some

I'm trying to go away 开发者_如何学编程from matlab and use python + matplotlib instead. However, I haven't really figured out what the matplotlib equivalent of matlab 'handles' is. So here's some matlab code where I return the handles so that I can change certain properties. What is the exact equivalent of this code using matplotlib? I very often use the 'Tag' property of handles in matlab and use 'findobj' with it. Can this be done with matplotlib as well?

% 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))


There is a findobj method is matplotlib too:

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()

Note that the gid parameter in plt.plot is usually used by matplotlib (only) when the backend is set to 'svg'. It use the gid as the id attribute to some grouping elements (like line2d, patch, text).


I have not used matlab but I think this is what you want

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()

Of course, this is just a basic plot, there is more to it.Go though this to find the graph you want and view its source code.


# 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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号