在下面的图中,取自 matplotlib 的画廊,contourf 用于在 3d 下创建一个 2d 图。我的问题是,是否可以使用 imshow 来做同样的事情?我希望二维图中的颜色更平滑。
制作二维图似乎是可能的,因为 contourf 接受 zdir 参数,而我看过而 imshow 没有。这表明这是不可能的,但为什么不呢?pcolor 也会完成工作,有可能吗?
在下面的图中,取自 matplotlib 的画廊,contourf 用于在 3d 下创建一个 2d 图。我的问题是,是否可以使用 imshow 来做同样的事情?我希望二维图中的颜色更平滑。
制作二维图似乎是可能的,因为 contourf 接受 zdir 参数,而我看过而 imshow 没有。这表明这是不可能的,但为什么不呢?pcolor 也会完成工作,有可能吗?
只需为 contourf 指定 levels= 选项,例如
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt,numpy as np
plt.clf()
fig = plt.figure(1)
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100,
levels=np.linspace(-100,100,1200),cmap=plt.cm.jet)
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=plt.cm.jet)
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=plt.cm.jet)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
比 sega_sai 的答案稍长一点的代码,但速度更快,而且我的经验对于更复杂的表面要好得多。
使用 plot_surface 在您想要的地方绘制一个平面,并使用 facecolors 使用您想要的值对其进行着色
您可能需要使用 scipy 的缩放使您的数据更平滑
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt,numpy as np
plt.clf()
fig = plt.figure(1)
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=plt.cm.jet)
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=plt.cm.jet)
### strating here:
# normalize Z to [0..1]
Z=Z-Z.min()
Z=Z/Z.max()
#use zoom to make your data smoother
from scipy.ndimage.interpolation import zoom
#make data 5 times smoother
X=zoom(X,5)
Y=zoom(Y,5)
Z=zoom(Z,5)
#draw a surface at -100, using the facecolors command to color it with the values of Z
cset = ax.plot_surface(X, Y, np.zeros_like(Z)-100,facecolors=plt.cm.jet(Z),shade=False)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
这也使得创建彩条变得更加困难,以便:
cb = plt.cm.ScalarMappable(cmap=plt.cm.jet)
cb.set_array(Z)
plt.colorbar(cb)
plt.show()