如何在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):

我想在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):

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