在3D图中显示imshow

8
在下面的图中,取自于Matplotlib库的画廊,contourf被用来创建3D图像下的2D图像。我的问题是,是否可能使用imshow做同样的事情?我希望2D图像中的颜色更加平滑。
制作2D图像似乎是可行的,因为contourf接受zdir参数,而我已经查看了imshow并没有这个参数。这表明这是不可能的,但为什么呢?pcolor也可以完成任务,那么它是否可以实现相同的功能呢?

2个回答

13

只需为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()

这是一张图片


2
这意味着为了近似图像,需要绘制1200多个表面?在这些日子里,成为矢量后端真的很辛苦:D - pwuertz

4

代码比sega_sai的答案稍长,但对于更复杂的表面来说更快且效果更好。使用plot_surface在所需位置绘制平面表面,并使用facecolors将其着色为所需值。您可能需要使用scipy的zoom使数据更加平滑。

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接