如何忽略colorbar中的NaN?

时间:2014-04-24 01:51:37

标签: python matplotlib

我有一个3D表面,伴随着一个颜色条,由

生成
surf = ax.plot_surface(xv, yv, zv, ...)
cb = fig.colorbar(surf)

当它工作时,它看起来像这样:

enter image description here

问题是某些值可能是NaN,在这种情况下,colorbar无法生成,如下所示:

Example

C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colorbar.py:581: RuntimeWarning: invalid value encountered in greater
  inrange = (ticks > -0.001) & (ticks < 1.001)
C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colorbar.py:581: RuntimeWarning: invalid value encountered in less
  inrange = (ticks > -0.001) & (ticks < 1.001)
C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colors.py:576: RuntimeWarning: invalid value encountered in less
  cbook._putmask(xa, xa < 0.0, -1)

我可以尝试用0(zv[isnan(zv)] = 0)替换zv的NaN值,但是生成的图形有垂直悬崖,这会使一些特征混淆和模糊,并且会使颜色条偏斜。 / p>

enter image description here

我想要的是颜色条忽略NaN值的方法。为此,我可以在创建后手动设置颜色条(amin(zv[~isnan(zv)])amax(zv[~isnan(zv)])),但我不知道如何执行此操作。

有关如何在计算颜色条和着色3d表面时忽略NaN的任何建议吗?

2 个答案:

答案 0 :(得分:8)

将调用中的vminvmax参数设置为plot_surface。这些值会影响颜色条映射的最小值和最大值。

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

def peaks(x, y):
    return x*np.sin(y)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
X, Y = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))

Z = peaks(X, Y)
Z[X+Y>3] = np.nan

surf = ax.plot_surface(X, Y, Z, alpha=0.3, cmap=plt.cm.jet,
                       vmin=np.nanmin(Z), vmax=np.nanmax(Z))
cbar = plt.colorbar(surf)

plt.show()

enter image description here

答案 1 :(得分:-1)

你应该可以在冲浪前从zv中排除NaN,如下所示:

surf = ax.plot_surface(xv, yv, zv[~isnan(zv)], ...)
cb = fig.colorbar(surf)

如果我理解正确,这应该完全解决问题。当然,我可能会感到困惑。祝你好运。