Matplotlib中的表面和3D轮廓

30
我想使用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()

输入图像描述

如果我给表面上的面添加透明度,那么我就可以看到轮廓,但是它看起来很混乱(请参见下面的代码和图像)

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

问题:是否有一种方法可以在matplotlib中获得这个结果?阴影并不是必需的。

输入图像描述


1
如果您将轮廓的 Alpha 值设置为较小的值,它可能会看起来不那么杂乱。 - drenerbas
2个回答

5

看起来这是一个bug,如果你尝试这样做

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

当你旋转屏幕时,你会发现轮廓线在不应该消失的情况下消失了。

抱歉,我不理解你的回答结论。这是一个对于该 bug 的解决方法吗(即某个旋转角度允许轮廓显示)?还是尝试同时显示 plot_surface 和 contours 是没有希望的? - John HaTrick

1
我认为您想将偏移量设置为轮廓线:

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

offset: 如果指定,则在垂直于 zdir 的平面上绘制等高线在此位置的投影。

注意,默认情况下 zdir = 'z',但您可以通过相应地设置 zdir 来在 x 或 y 方向上进行投影。


不是的,这将在2D中绘制轮廓。但不是我想要的3D。请参见示例图像,它具有白色轮廓。 - nicoguaro
1
啊,好的,抱歉我误解了问题。 - tmdavison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接