Joh*_*ith 7 python garbage-collection matplotlib ipython
我有一个与此类似的绘图功能
def fct():
f=figure()
ax=f.add_subplot(111)
x,y=mgrid[0:5,0:5]
z=sin(x**2+y**2)
ax.pcolormesh(x,y,z)
Run Code Online (Sandbox Code Playgroud)
当我在ipython(使用--pylab选项)中定义上面的函数,然后调用
fct()
colorbar()
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
"RuntimeError:找不到用于创建颜色栏的mappable."
def fct():
f=figure()
x,y=mgrid[0:5,0:5]
z=sin(x**2+y**2)
pcolormesh(x,y,z)
Run Code Online (Sandbox Code Playgroud)
然后它工作.我想这与垃圾收集有关 - 如何在第一个例子中防止这个问题?
CT *_*Zhu 14
这是因为你是第一个例子,你正在使用ax.polormesh,而不是pyplot.polotmesh(命名空间导入pylab),当你调用colorbar()(实际上plt.colorbar())时,它失去了哪个可映射的轨道以及它应该使颜色栏成为哪个轴.
因此,添加这些行将使其工作:
import matplotlib.pyplot as plt
fct()
ax=plt.gca() #get the current axes
PCM=ax.get_children()[2] #get the mappable, the 1st and the 2nd are the x and y axes
plt.colorbar(PCM, ax=ax)
Run Code Online (Sandbox Code Playgroud)

现在你提到你的实际情节要复杂得多.您想确保它是ax.get_children()[2]或者您可以通过查找matplotlib.collections.QuadMesh实例来选择它.
我认为它更多地与pylab状态机和范围有关.
更好的做法是执行以下操作(显式优于隐式):
import numpy as np
import matplotlib.pyplot as plt
def fct():
f = plt.figure()
ax = f.add_subplot(111)
x, y = np.mgrid[0:5,0:5]
z = np.sin(x**2+y**2)
mesh = ax.pcolormesh(x, y ,z)
return ax, mesh
ax, mesh = fct()
plt.colorbar(mesh, ax=ax)
Run Code Online (Sandbox Code Playgroud)
你的功能非常小并且没有参数,所以你真的需要将绘图包装在一个函数中吗?关于什么:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
x, y = np.mgrid[0:5,0:5]
z = np.sin(x**2+y**2)
mesh = ax.pcolormesh(x, y ,z)
fig.colorbar(mesh)
plt.show()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
14279 次 |
| 最近记录: |