matplotlib

时间:2016-02-17 00:03:26

标签: python matplotlib surface mplot3d

我想使用matplotlib绘制带有色彩图,线框和轮廓的曲面。像这样:

enter image description here

请注意,我不是在询问平行于xy的平面中的轮廓,而是询问图像中 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中获得此结果?但是,阴影不是必需的。

2 个答案:

答案 0 :(得分: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()

然后旋转,当它们不应该

时,你会看到轮廓线消失

答案 1 :(得分: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

垂直的平面中此位置上的轮廓线的投影

注意,默认情况下为zdir = 'z',但您可以在x或y方向投影相应地设置zdir