2016-02-17 20 views
5

Vorrei tracciare una superficie con una mappa colori, wireframe e contorni usando matplotlib. Qualcosa di simile a questo:Superficie e contorno 3d in matplotlib

enter image description here

Si noti che non sto chiedendo circa i contorni che si trovano nel piano parallelo xy, ma quelli che sono 3D e bianche nell'immagine.

Se passo il modo ingenuo e tracciamo tutte queste cose non riesco a vedere i contorni (vedi codice e immagine sotto).

import numpy as np 
from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111, projection="3d") 
X, Y = np.mgrid[-1:1:30j, -1:1:30j] 
Z = np.sin(np.pi*X)*np.sin(np.pi*Y) 
ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0.5, rstride=1, cstride=1) 
ax.contour(X, Y, Z, 10, lw=3, cmap="autumn_r", linestyles="solid", offset=-1) 
ax.contour(X, Y, Z, 10, lw=3, colors="k", linestyles="solid") 
plt.show() 

enter image description here

Se un aggiungere trasparenza alle sfaccettature di superficie, allora posso vedere i contorni, ma sembra davvero ingombra (vedi codice e l'immagine di seguito)

import numpy as np 
from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111, projection="3d") 
X, Y = np.mgrid[-1:1:30j, -1:1:30j] 
Z = np.sin(np.pi*X)*np.sin(np.pi*Y) 
ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0.5, rstride=1, cstride=1, alpha=0.5) 
ax.contour(X, Y, Z, 10, lw=3, cmap="autumn_r", linestyles="solid", offset=-1) 
ax.contour(X, Y, Z, 10, lw=3, colors="k", linestyles="solid") 
plt.show() 

enter image description here

Domanda: C'è un modo per ottenere questo risultato in matplotlib? L'ombreggiatura non è necessaria, però.

risposta

0

penso che si desidera impostare l'offset per il contorno:

ax.contour(X, Y, Z, 10, offset=-1, lw=3, colors="k", linestyles="solid", alpha=0.5) 

Vedi questo esempio per più:

http://matplotlib.org/examples/mplot3d/contour3d_demo3.html

E la documentazione qui:

http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#contour-plots

Offset: Se stampa specificato una proiezione delle linee di contorno in questa posizione nel piano normale zdir

nota, zdir = 'z' per impostazione predefinita, ma è possibile proiettare nella direzione X o Y essere impostando il zdir conseguenza.

+0

Non proprio, questo sarà tracciare il contorno in 2D . Ma non in 3D come li voglio. Vedi l'immagine di esempio, ha contorni bianchi. – nicoguaro

+1

Ah ok, scusa ho frainteso la domanda – tom

2

A quanto pare si tratta di un bug, se si tenta questo

import numpy as np 
from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111, projection="3d") 
X, Y = np.mgrid[-1:1:30j, -1:1:30j] 
Z = np.sin(np.pi*X)*np.sin(np.pi*Y) 


ax.plot_surface(X, Y, Z, cmap="autumn_r", lw=0, rstride=1, cstride=1) 
ax.contour(X, Y, Z+1, 10, lw=3, colors="k", linestyles="solid") 
plt.show() 

e ruotano intorno, potrete vedere le linee di contorno scomparire quando non dovrebbero