我有一个类似于这个的绘图功能
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)
然后它有效。我想这与垃圾收集有关 - 如何在第一个例子中防止这个问题?
答案 0 :(得分:13)
这是因为您是第一个示例,当您致电ax.polormesh
时,您正在使用pyplot.polotmesh
,而不是pylab
(由colorbar()
导入的名称空间)(实际上{{1} }),它失去了哪个可映射的轨道以及应该使哪个轴成为彩色条。
因此,添加这些行将使其工作:
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)
,或者您可以通过查找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()
答案 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)