如何在Python中将子图绘制并保存为新的class方法?

How to draw and save a subplot figure as a new class method in Python?

我想在 Python (v2.7.12) 中创建一个单独的 class,它将把绘图保存到文件中(此处 'test.eps')并使用一些标签、标题等。由用户作为参数给出(*args 和 **kwargs)。

背景故事是我必须为科学数据创建图表,我希望 Python class 简单且适合我的情况。

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 赋予属性并绘制绘图。

你能帮我理解这个问题并找到解决方案吗?

我运行控制台中的脚本: pythonhomfigs.py

输出为: 属性集列表:['title'、'ylabel'、'xlabel'、'arg_lst'] yyy xxx 非常重要的标题

问题:

注意区别

ax.set_title = "some title"

ax.set_title("some title")

第一个将 class 属性 set_title 从方法更改为字符串。第二个使用 class 方法 set_title,它设置轴的标题。

使用setattr相当于第一种情况。因此,您通过用字符串覆盖它来破坏有用的 class 方法。之后你 (a) 不能再使用该方法 (b) 还没有设置标题(甚至不能再这样做,因为 (a))。

解决方案:

虽然我不相信您正在使用的 class 的结构,但可以实际调用相应的方法

for key in self.arg_lst:
    getattr(ax1,'set_'+key)(getattr(self,key))

推荐:

如果可以的话,我建议不要将属性存储在图的属性中 class。似乎没有必要 subclass Figure 反正。相反,您可以将 args 和 kwargs 存储在 class 变量中;例如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()