python" exec"不知道如何定义包含matplotlib图的列表

时间:2016-04-21 04:53:31

标签: python list matplotlib exec

我正在使用以下代码创建matplotlib.subplots函数的包装器:

def subpl(x,*argv): 
    # each argv is a vector to be plotted
    # x is the x vector
    noAxes=len(argv)
    ax=[0]*noAxes
    [f,ax]=plt.subplots(noAxes,sharex=True,sharey=True)
    for count in np.arange(noAxes):
        ax[count].plot(x,argv[count])
        ax[count].grid()
    mng = plt.get_current_fig_manager()

这很好用。但是,我想从当前函数传递f,ax和mng,这样在调用函数中,我可以更改参数,例如添加轴标题等。我希望使用单个级别来执行此操作列表类似于以下内容:

    outputList = [ax[0], ax[1], ax[2], f, mng]
    return outputList

这很好用。在这个例子中,有3个子绘图轴,但我希望这个包装函数适用于任意数量的输入子图。 我尝试了以下方法:

    strToExec="fh=["
    for count in np.arange(noAxes):
        strToExec+="ax["+str(count)+"],"
    strToExec += "f,mng]"
    print(strToExec)
    exec(strToExec)
    return outputList

然而,这个错误被抛回:

    Traceback (most recent call last):
...
    File "C:\Python34\ware\functions\processAllData2.py", line 386, in subpl
        return outputList
    NameError: name 'outputList' is not defined

因此,以下代码行:

outputList = [ax[0], ax[1], ax[2], f, mng]

可以自行运行,但在exec(" ...")函数中,它不起作用。我通过复制和粘贴exec中的确切代码行来确认这一点(" ..."),它会抛出相同的错误。 这似乎是exec函数的一个缺陷。它将执行大多数代码但不是全部。 顺便说一句,我也尝试过:

outputList=ax+[f]+[mng]

但它会引发以下错误:

Traceback (most recent call last):
...      
File "C:\Python34\ware\functions\processAllData2.py", line 361, in subpl outputList = ax+[f]+[mng]
TypeError: unsupported operand type(s) for +: 'AxesSubplot' and 'Figure'

故事的寓意是,当你试图放置一个“matplotlib.figure.Figure”时,Python似乎有点触动。使用exec()或" +"将对象放入列表中级联。 是的,我应该停止浪费时间,并对一个简单的多级列表感到满意,比如

outputList = [ax, f, mng]

,但我很懒,并试图避免使用像

这样的表达式
outputList[0][2]

我还认为我应该在列表中使用matplotlib数字时指出python exec()中的这个缺陷,以防万一开发python的人通常不知道。

解决我的问题也很好。

干杯, 彼得

0 个答案:

没有答案