2012-06-06 8 views
7

Dans le graphique ci-dessous, tiré de la galerie de matplotlib, contourf est utilisé pour créer un tracé 2D sous le 3D. Ma question est la suivante: est-il possible d'utiliser imshow pour faire la même chose? Je voudrais que les couleurs de l'intrigue 2D soient plus fluides.Matplotlib: imshow dans le tracé 3D

Faire le tracé 2d semble être possible parce que contourf accepte un argument zdir, alors que j'ai regardé et imshow ne le fait pas. Cela suggère que ce n'est pas possible, mais pourquoi pas? Pcolor ferait aussi le travail, est-ce possible?

Répondre

11

Il suffit de spécifier les niveaux = option pour le contourf, par exemple

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

The image

+0

Excellent, merci. –

+2

Cela signifie qu'il y a plus de 1200 surfaces dessinées pour approximer l'image? C'est dur d'être un backend vectoriel ces jours-ci: D – pwuertz

3

Un peu de code plus alors la réponse de sega_sai mais plus rapide et mon expérience beaucoup mieux pour les surfaces plus complexes.

Utilisez plot_surface pour tracer une surface plane où vous le voulez et facecolors de la couleur avec les valeurs que vous souhaitez

Vous pourriez avoir besoin de rendre vos données plus lisse avec le zoom 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() 

ready image

Cela rend également un peu plus difficile de créer une barre de couleur, pour cela:

cb = plt.cm.ScalarMappable(cmap=plt.cm.jet) 
cb.set_array(Z) 
plt.colorbar(cb) 
plt.show()