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

时间:2014-04-15 17:43:26

标签: python matplotlib garbage-collection 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)

当我在ipython中定义上述功能时(使用--pylab选项),然后调用

fct()
colorbar()

我收到错误

  

" RuntimeError:找不到用于创建颜色栏的mappable。"。

def fct():
    f=figure()
    x,y=mgrid[0:5,0:5]
    z=sin(x**2+y**2)
    pcolormesh(x,y,z)

然后它有效。我想这与垃圾收集有关 - 如何在第一个例子中防止这个问题?

4 个答案:

答案 0 :(得分:13)

这是因为您是第一个示例,当您致电ax.polormesh时,您正在使用pyplot.polotmesh,而不是pylab(由colorbar()导入的名称空间)(实际上{{1} }),它失去了哪个可映射的轨道以及应该使哪个轴成为彩色条。

因此,添加这些行将使其工作:

plt.colorbar()

enter image description here

现在你提到你的实际情节要复杂得多。您希望确保它是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) ,或者您可以通过查找ax.get_children()[2]实例来选择它。

答案 1 :(得分: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)

答案 2 :(得分:4)

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

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()

enter image description here

答案 3 :(得分:0)

对我来说,以下代码不起作用

PCM=ax.get_children()[2] 
plt.colorbar(PCM, ax=ax)

由于我的绘图有点复杂,因此我不得不根据@lib的注释使用以下代码。

ax=plt.gca() #get the current axes
for PCM in ax.get_children():
    if isinstance(PCM, mpl.cm.ScalarMappable):
        break
        
plt.colorbar(PCM, ax=ax)