2016-02-17 22 views
5

Chciałbym wykreślić powierzchnię za pomocą mapy kolorów, modelu szkieletowego i konturów przy użyciu matplotlib. Coś takiego:Kontur powierzchniowy i 3D w matplotlib

enter image description here

Zauważ, że ja nie pytam o konturach, które leżą w płaszczyźnie równoległej do xy ale te, które są 3D i białe w obrazie.

Jeśli pójdę w naiwny sposób i knuję te wszystkie rzeczy, nie widzę konturów (patrz kod i obrazek poniżej).

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

Jeśli dodać przezroczystość do aspektów powierzchniowych potem widzę kontury, ale wygląda naprawdę bałagan (patrz kod i obrazek poniżej)

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

Pytanie: Czy istnieje sposób na uzyskanie tego wyniku w matplotlib? Cieniowanie nie jest jednak konieczne.

Odpowiedz

0

myślę chcesz ustawić offset do konturu:

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

Zobacz przykład na więcej:

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

I docs tutaj:

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

offset: Jeżeli określona działka projekcja linii kontur na tej pozycji w płaszczyźnie prostopadłej do zdir

Uwaga, zdir = 'z' domyślnie, ale można rzutować w kierunku x lub y jest ustawienie zdir odpowiednio.

+0

Nie bardzo, to będzie wykreślić kontur 2D . Ale nie w 3D, tak jak ja chcę. Zobacz przykładowy obraz, ma białe kontury. – nicoguaro

+1

Ach, przepraszam, źle zrozumiałem pytanie – tom

2

Najwyraźniej jest to błąd, jeśli spróbujesz to

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

i obracać wokół, widać linie konturowe znikają, gdy nie powinno

Powiązane problemy