3d 在matplotlib中的三维打印上绘制直线

3d 在matplotlib中的三维打印上绘制直线,3d,matplotlib,3d,Matplotlib,我有一个3D图,看起来很像,但是我想在底部等高线图上添加两条线。我希望这两条线交叉并指向一个特定的(x,y)值 我可以在那里画一条线,但它总是在等高线图下面,尽管我做了多次尝试。谁能帮我画等高线图上的线吗?我正在下面粘贴我的代码。该线仅在从轮廓伸出的部分可见 #!/usr/bin/env python import sys, re, math import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from

我有一个3D图,看起来很像,但是我想在底部等高线图上添加两条线。我希望这两条线交叉并指向一个特定的(x,y)值

我可以在那里画一条线,但它总是在等高线图下面,尽管我做了多次尝试。谁能帮我画等高线图上的线吗?我正在下面粘贴我的代码。该线仅在从轮廓伸出的部分可见

#!/usr/bin/env python

import sys, re, math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import LineCollection
from matplotlib import cm
from matplotlib.mlab import griddata
import numpy as np

x = []
y = []
z = []
for i in range(0,628,10) :
  for j in range(0,628,10) :
    x.append(i*0.01)
    y.append(j*0.01)
    z.append(math.sin(x[-1]*y[-1])*20)

fig = plt.figure()
ax = fig.gca(projection='3d')

xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))

X, Y = np.meshgrid(xi, yi)
Z = griddata(x, y, z, xi, yi)
ax.autoscale(False)
ax.view_init(elev=30, azim=-140)

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.cool,
               linewidth=0.1, antialiased=True, shade=True,alpha=0.8)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.cool, cstride=1,
        linewidth=0.1, antialiased=True, shade=True)

ax.set_xlim3d(0, math.pi*2)
ax.set_ylim3d(0, math.pi*2)
ax.set_zlim3d(-100, 20)

xi = [0,6]
yi = [3,3]
l=zip(xi,yi)
lines = LineCollection((l,l),zorder=10000,color='k')
ax.add_collection3d(lines,zs=-90)

plt.show()

因为Axe3D将通过3d投影计算每个3d对象的
zorder
属性。要禁用此功能,您可以创建一个
FixZorderCollection
类并更改三维线的
\uuuu class\uuu
属性。以下是一个完整的示例:

import sys, re, math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import LineCollection
from matplotlib import cm
from matplotlib.mlab import griddata
import numpy as np

x = []
y = []
z = []
for i in range(0,628,10) :
  for j in range(0,628,10) :
    x.append(i*0.01)
    y.append(j*0.01)
    z.append(math.sin(x[-1]*y[-1])*20)

fig = plt.figure()
ax = fig.gca(projection='3d')

xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))

X, Y = np.meshgrid(xi, yi)
Z = griddata(x, y, z, xi, yi)
ax.autoscale(False)
ax.view_init(elev=30, azim=-140)

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.cool,
               linewidth=0.1, antialiased=True, shade=True,alpha=0.8)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.cool, cstride=1,
        linewidth=0.1, antialiased=True, shade=True)

ax.set_xlim3d(0, math.pi*2)
ax.set_ylim3d(0, math.pi*2)
ax.set_zlim3d(-100, 20)

xi = [0,6]
yi = [3,3]
l=zip(xi,yi)
lines = LineCollection((l,l),zorder=1000,color='k',lw=3)
ax.add_collection3d(lines,zs=-90)

from mpl_toolkits.mplot3d.art3d import Line3DCollection

class FixZorderCollection(Line3DCollection):
    _zorder = 1000

    @property
    def zorder(self):
        return self._zorder

    @zorder.setter
    def zorder(self, value):
        pass

ax.collections[-1].__class__ = FixZorderCollection

plt.show()
输出:


海瑞的回答对我有帮助。因为tnorgd想知道如何做散点图(我还不能评论),我在这里给出答案。pyplot.scatter在投影“3d”中创建Patch3DCollection。因此,同样的技巧也会奏效:

from mpl_toolkits.mplot3d.art3d import Patch3DCollection
class FixZorderScatter(Patch3DCollection):
    _zorder = 2000
    @property
    def zorder(self):
        return self._zorder
    @zorder.setter
    def zorder(self, value):
        pass

但是我怎样才能使这个技巧与散点图一起工作呢?我还需要在contourf零件上标记几个点。我想我会在轮廓图的顶部绘制一个散点图,但它隐藏在轮廓图的下面