matplotlib colorbar不工作(由于垃圾收集?)

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实例来选择它.

  • 在我的情况下,情节更复杂,要找到我必须做的正确孩子:`for PCM in ax.get_children(): if type(PCM) == matplotlib.image.AxesImage: break` (2认同)

Pau*_*l H 6

我认为它更多地与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)


wfl*_*nny 5

你的功能非常小并且没有参数,所以你真的需要将绘图包装在一个函数中吗?关于什么:

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)

在此输入图像描述

  • 我的函数只是一个最小的工作示例。实际的绘图函数要复杂得多,而且会被反复调用,所以我只想写一次。 (3认同)