如何在Python中绘制子图并将其保存为新的类方法?
我想在Python(v2.7.12)中创建一个单独的类,将绘图保存到文件中(这里是“test.eps”),并使用用户提供的一些标签、标题等作为参数(*args和**kwargs) 背景故事是,我必须为科学数据创建绘图,我希望Python类简单且适合我的情况如何在Python中绘制子图并将其保存为新的类方法?,python,matplotlib,plot,subplot,Python,Matplotlib,Plot,Subplot,我想在Python(v2.7.12)中创建一个单独的类,将绘图保存到文件中(这里是“test.eps”),并使用用户提供的一些标签、标题等作为参数(*args和**kwargs) 背景故事是,我必须为科学数据创建绘图,我希望Python类简单且适合我的情况 import matplotlib.pyplot as plt # class of figures for channel flow # with one subfigure class Homfig(plt.Figure):
import matplotlib.pyplot as plt
# class of figures for channel flow
# with one subfigure
class Homfig(plt.Figure):
# *args: list of plot features for ax1.plot
# (xdata,ydata,str linetype,str label)
# **kwargs: list of axes features for ax1.set_$(STH)
# possible keys:
# title,xlabel,ylabel,xlim,ylim,xscale,yscale
def __init__(self,*args,**kwargs):
self.arg_lst = []
for key,value in kwargs.iteritems():
setattr(self,key,value)
self.arg_lst.append(key)
i=0
for value in args:
setattr(self,'plot'+str(i),value)
i=i+1
print 'list of attributes set: ', self.__dict__.keys()
def hdraw(self):
fig2=plt.figure()
ax1 = fig2.add_subplot(111)
for key in self.arg_lst:
setattr(ax1,'set_'+key,getattr(self,key))
print getattr(ax1,'set_'+key)
ax1.plot([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], label="Test", color='g')
leg = ax1.legend(loc=4)
plt.savefig('test.eps')
plt.clf()
ff = Homfig(title='very important title',xlabel="xxx",ylabel="yyy")
ff.hdraw()
方法“hdraw”应该绘制我的数据并将其保存到文件中。
代码未给出错误消息,但未看到打印标题或轴标签的更改。属性被赋予ax1并绘制绘图
你能帮我理解这个问题并找到解决办法吗
我在控制台中运行脚本:
python homfigs.py
输出为:
属性集列表:['title','ylabel','xlabel','arg_lst']
yyy
xxx
非常重要的标题问题:
注意两者之间的区别
ax.set_title = "some title"
及
第一个将class属性set\u title
从方法更改为字符串。第二种方法使用class方法set\u title
,该方法设置轴的标题
使用setattr
相当于第一种情况。因此,通过用字符串覆盖它,您正在破坏有用的classmethod。之后,您(a)不能再使用该方法(b)仍然没有设置标题(甚至不能再这样做,因为(a))
解决方案:
虽然我不相信您正在使用的类的结构,但一种方法是准确地调用相应的方法
for key in self.arg_lst:
getattr(ax1,'set_'+key)(getattr(self,key))
建议:
如果可以,我建议不要将属性存储在Figure类的属性中。无论如何,似乎没有必要将Figure
子类化。相反,您可以将args和kwargs存储在一个类变量中;e、 g.kwargs已经是一个字典,其值可以用作绘图的属性,因此甚至不需要存在self.arg_lst
import matplotlib.pyplot as plt
# class of figures for channel flow
# with one subfigure
class Homfig():
# *args: list of plot features for ax1.plot
# (xdata,ydata,str linetype,str label)
# **kwargs: list of axes features for ax1.set_$(STH)
# possible keys:
# title,xlabel,ylabel,xlim,ylim,xscale,yscale
def __init__(self,*args,**kwargs):
self.args = args
self.kwargs = kwargs
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111)
for key, val in self.kwargs.iteritems():
getattr(self.ax,'set_'+key)(val)
def hdraw(self):
self.ax.plot([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], label="Test", color='g')
leg = self.ax.legend(loc=4)
def save(self, name="text"):
self.fig.savefig(name+'.eps')
ff = Homfig(title='very important title',xlabel="xxx",ylabel="yyy")
ff.hdraw()
ff.save()
plt.show()
这很好,但有一个问题:当我用self.fig=plt.figure()创建一个图形时,我不需要在某个地方关闭它吗“plt.close(图)”您可以关闭它。如果你的数据少于10位数左右,你就不必担心了。一旦脚本停止运行,就会释放内存。如果您有许多复杂的大数字并遇到问题,当然可以在显示下一个数字之前关闭它们。您可以执行
plt.close(ff.fig)
或ff.fig.close()
或在某个点执行plt.close(“全部”)
。
import matplotlib.pyplot as plt
# class of figures for channel flow
# with one subfigure
class Homfig():
# *args: list of plot features for ax1.plot
# (xdata,ydata,str linetype,str label)
# **kwargs: list of axes features for ax1.set_$(STH)
# possible keys:
# title,xlabel,ylabel,xlim,ylim,xscale,yscale
def __init__(self,*args,**kwargs):
self.args = args
self.kwargs = kwargs
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111)
for key, val in self.kwargs.iteritems():
getattr(self.ax,'set_'+key)(val)
def hdraw(self):
self.ax.plot([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], label="Test", color='g')
leg = self.ax.legend(loc=4)
def save(self, name="text"):
self.fig.savefig(name+'.eps')
ff = Homfig(title='very important title',xlabel="xxx",ylabel="yyy")
ff.hdraw()
ff.save()
plt.show()