如何将(* args,** kwargs)类型的属性传递给类中的函数?

时间:2017-07-05 13:49:41

标签: python matplotlib subplot named-parameters

我想为我的科学数据创建一个自定义绘图的模块,但我不知道如何将(*arg2,**kwarg2)类型的参数传递给方法。

以下是相关代码:

import numpy as np
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):
        for arg in self.args:
            self.ax.plot(*arg)
            leg = self.ax.legend(loc=4)

问题是arg本身就是(*agr2,**kwarg2)这样的元组,当我打电话时     self.ax.plot(* ARG) 它没有看到命名变量。 函数hdraw应该对来自init的*args中的输入进行操作,并且绘图行的数据将在arg中传递。 如何表达arg由未命名和命名的变量组成? 当我想在一个图中有几行(不同的self.ax.plotlabel等)时,linetype可能会被调用一次以上。)

我用其他python脚本调用模块:

meanfig = hfig.Homfig((datax,datay),title='test plot')
meanfig.hdraw()

如何向self.ax.plot添加标签或线型等功能,例如:

meanfig = hfig.Homfig((datax,datay,label="test_label",linetype ='o'),title='test plot')

1 个答案:

答案 0 :(得分:1)

您应该能够使用双**传递它们,即

def hdraw(self):
    self.ax.plot(*self.args, **self.kwargs)
    leg = self.ax.legend(loc=4)

然后使用

调用它
meanfig = hfig.Homfig(datax, datay, label="test_label", linetype ='o', title='test plot')

根据评论更新:

如果你想在同一个图中绘制多个图,那么你写的方式会很难,但你可以这样做

class Homfig:
    def __init__(self, title):
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)

        self.args = []
        self.kwargs = []

    def add_plot(self, *args, **kwargs):
        self.args.append(args)
        self.kwargs.append(kwargs)

    def hdraw(self):
        for args, kwargs in zip(self.args, self.kwargs):
            self.ax.plot(*args, **kwargs)
        leg = self.ax.legend(loc=4)

然后使用

调用它
meanfig = hfig.Homfig(title='test plot')
meanfig.add_plot(datax, datay, label="test_label", linetype ='o')
meanfig.add_plot(datax, 2 * datay, label="test_label_2", linetype ='o')
meanfig.hdraw()