我正在使用以下代码创建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的人通常不知道。
解决我的问题也很好。
干杯, 彼得