2016-02-17 4 views
5

Я хотел бы построить поверхность с цветовой гаммой, каркасом и контурами с использованием matplotlib. Что-то вроде этого:Поверхностный и 3d контур в matplotlib

enter image description here

Обратите внимание, что я не прошу о контурах, которые лежат в плоскости, параллельной ху, но те, которые 3D и белые в изображении.

Если я иду наивным способом и замышляю все эти вещи, я не вижу контуров (см. Код и изображение ниже).

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

Если добавить прозрачность к поверхности граней, то можно увидеть контуры, но это выглядит очень суматоху (см код и изображение ниже)

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

Вопрос: Есть ли способ получить этот результат в matplotlib? Тем не менее, затенение не обязательно.

ответ

0

Я думаю, что вы хотите установить смещение контура:

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

Смотрите этот пример для более:

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

И документы здесь:

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

смещение: Если указан участок проекция контурных линий на этой позиции в плоскости, перпендикулярной к zdir

Note, zdir = 'z' по умолчанию, но вы можете проецировать в х или у направление будет установка zdir соответственно.

+0

Не совсем, это будет строить контур в 2D , Но не в 3D, как я их хочу. См. Пример изображения, он имеет белые контуры. – nicoguaro

+1

А, ладно, извините, я неправильно понял вопрос – tom

2

Видимо это ошибка, если вы попытаетесь это

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

и вращаться вокруг, вы увидите, контурные линии исчезают, когда они не должны

Смежные вопросы