我有一个3D表面,伴随着一个颜色条,由生成
surf = ax.plot_surface(xv, yv, zv, ...)
cb = fig.colorbar(surf)
Run Code Online (Sandbox Code Playgroud)
当它工作时,它看起来像这样:

问题是某些值可能是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)
Run Code Online (Sandbox Code Playgroud)
我可以尝试用0(zv[isnan(zv)] = 0)替换zv的NaN值,但随后生成的图形具有垂直悬崖,这会使一些特征混淆和模糊,并且会使颜色条偏斜.

我想要的是颜色条忽略NaN值的方法.要做到这一点,我可以在创建后手动设置颜色条(amin(zv[~isnan(zv)])和amax(zv[~isnan(zv)])),但我不知道如何做到这一点.
有关如何在计算颜色条和着色3d表面时忽略NaN的任何建议?
在调用中设置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()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |