我有一个3D表面,伴随着一个颜色条,由
生成surf = ax.plot_surface(xv, yv, zv, ...)
cb = fig.colorbar(surf)
当它工作时,它看起来像这样:
问题是某些值可能是NaN,在这种情况下,colorbar无法生成,如下所示:
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>
我想要的是颜色条忽略NaN值的方法。为此,我可以在创建后手动设置颜色条(amin(zv[~isnan(zv)])
和amax(zv[~isnan(zv)])
),但我不知道如何执行此操作。
有关如何在计算颜色条和着色3d表面时忽略NaN的任何建议吗?
答案 0 :(得分:8)
将调用中的vmin
和vmax
参数设置为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()
答案 1 :(得分:-1)
你应该可以在冲浪前从zv中排除NaN,如下所示:
surf = ax.plot_surface(xv, yv, zv[~isnan(zv)], ...)
cb = fig.colorbar(surf)
如果我理解正确,这应该完全解决问题。当然,我可能会感到困惑。祝你好运。