将参数传递给Matplotlib

时间:2017-09-12 11:32:44

标签: python matplotlib

我写了一个函数来保存Matplotlib中的图。当我想通过调用plt.savefig(fname=path, dpi=dpi, format=ext, bbox_inches="tight")来使用它时,我收到了以下错误。

  File "/home/jruota/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 697, in savefig
    res = fig.savefig(*args, **kwargs)
  File "/home/jruota/.local/lib/python2.7/site-packages/matplotlib/figure.py", line 1572, in savefig
    self.canvas.print_figure(*args, **kwargs)
TypeError: print_figure() takes at least 2 arguments (5 given)

将呼叫更改为plt.savefig(path, dpi=dpi, format=ext, bbox_inches="tight")时,不会发生此错误。我的猜测是这个错误与***参数打包和解包有关,但我不确定究竟是怎么回事。任何解释都将不胜感激。

1 个答案:

答案 0 :(得分:4)

首先,很明显,如果

plt.savefig(path, dpi=dpi, format=ext, bbox_inches="tight")

工作正常,你可以简单地使用它。

错误来自fname不是命名参数。 The documentation对于那些不熟悉python中的呼叫签名的人来说可能有点混乱。

签名为matplotlib.pyplot.savefig(*args, **kwargs),其中需要设置参数fname,并且可以指定其他关键字参数。当然,参数不能是关键字参数。所以在

fname = "myfile.png"
plt.savefig(fname, dpi=100)

fname是参数,而在

fname = "myfile.png"
plt.savefig(fname=fname, dpi=100)

fname是一个关键字参数,因此找不到指定文件名的参数。

如果您愿意,可以使用自定义函数进行测试:

def f(*args,**kwargs):
    print "args: ",  args
    print "kwargs: ", kwargs

然后

f("q", k="W")  # prints args:  ('q',)
               #        kwargs:  {'k': 'W'}

,而

f(fname="q", k="W") # prints args:  ()
                    #        kwargs:  {'k': 'W', 'fname': 'q'}

在后一种情况下,args为空。