在Python

时间:2017-08-15 17:43:03

标签: python matplotlib plot multiple-axes

我正在构建一个包装器来在Matplotlib中生成绘图,我希望能够可选指定构建绘图的轴。

例如,我有:

def plotContourf(thing, *argv, **kwargs):
    return plt.tricontourf(thing[0], thing[1], thing[2], *argv, **kwargs)

def plotScatter(thing, *argv, **kwargs )
    return plt.scatter(thing[0], thing[1], *argv, **kwargs)

fig, ((ax0,ax1),(ax2,ax3)) = plt.subplots(2,2)

plotContourf(some_thing, axes=ax0)
plotScatter(some_thing, axes=ax2)

哪个运行,但是一切都在最后一个轴(ax3)上绘制,而不是在通过轴kwargument指定的轴上绘制。 (这里没有错误,只是出现在错误的轴上)

对于好奇,我想这样做的原因是用户可以设置一个轴,或者对于懒人来说,他们可以只调用没有指定轴的plotContourf()并且仍然得到他们可以得到的东西.show()

另一方面,我试过

def plotContourf(thing, axes=None, *argv, **kwargs):
    if axes is None:
        fig, axes = plt.subplots()

    return axes.tricontourf(thing[0], thing[1], thing[2], *argv, **kwargs)

但后来我得到了:

TypeError:plotContourf()为关键字参数'axes'

获取了多个值

我知道这个错误是由于'axes'已经是一个关键字参数。我知道我可以使用不同的关键字,但是轴kwarg的用途是什么?

谢谢!

修改 完全追溯(针对上述第二个选项):

Traceback (most recent call last):
  File "mods.py", line 51, in <module>
    adcirc.plotContourf(hsofs_mesh, -1*hsofs_mesh['depth'], axes=ax0)
TypeError: plotContourf() got multiple values for keyword argument 'axes'

实际的包装器:

def plotContourf(grid, axes=None, *argv, **kwargs): 
    if axes is None:
        fig, axes = plt.subplot()
    return axes.tricontourf(grid['lon'], grid['lat'], grid['Elements']-1, *argv, **kwargs)

2 个答案:

答案 0 :(得分:1)

问题是,您使用-1*hsofs_mesh['depth']代替axes调用该函数,然后在最后再次添加axes关键字参数。

In [10]: def fun(a, x=1, *args, **kwargs):
    ...:     print(x)
    ...:     

In [11]: fun(1, 3, x=4)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-31b5e42fb4be> in <module>()
----> 1 fun(1, 3, x=4)

TypeError: fun() got multiple values for keyword argument 'x'

在此示例中看到它将3读为x,然后我正在传递x=4。导致您遇到的错误。

解决方案是在函数中添加另一个参数,如下所示:

def plotContourf(thing, other_thing=None, axes=None, *argv, **kwargs):

答案 1 :(得分:1)

您可以将axes保留为关键字参数,这样可以省去考虑其他参数顺序的麻烦。

import matplotlib.pyplot as plt
import numpy as np

def plotContourf(thing, *argv, **kwargs):
    axes = kwargs.pop("axes", None)
    if not axes:
        fig, axes = plt.subplots()

    return axes.tricontourf(thing[0], thing[1], thing[2], *argv, **kwargs)

a = [np.random.rand(10) for i in range(3)]
plotContourf(a) 

#or

fig, ax = plt.subplots()
plotContourf(a, axes=ax)

plt.show()