Python 在matplotlib中显示曲面前面的等高线
我一直在四处寻找答案,但我似乎不明白为什么在我的代码中我不能让投影轮廓显示在曲面的“后面”Python 在matplotlib中显示曲面前面的等高线,python,python-2.7,matplotlib,surface,Python,Python 2.7,Matplotlib,Surface,我一直在四处寻找答案,但我似乎不明白为什么在我的代码中我不能让投影轮廓显示在曲面的“后面” from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D import numpy as np fig = plt.figure() ax = fig.gca(projection='3d
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.array([[200,800,1500,2000,3000],[200,700,1500,2000,3000],[200,800,1500,2000,3000],[200,800,1500,2000,3000]])
Y = np.array([[50,50,50,50,50],[350,350,350,350,350],[500,500,500,500,500],[1000,1000,1000,1000,1000]])
Z = np.array([[0,0,33,64,71],[44,62,69,74,76],[59,67,72,75,77],[63,68,73,76,77]])
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5)
cset = ax.contourf(X, Y, Z, zdir='z', offset=0, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='x', offset=200, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='y', offset=1000, cmap=cm.coolwarm)
ax.set_xlabel('X')
ax.set_xlim(200, 3000)
ax.set_ylabel('Y')
ax.set_ylim(0, 1000)
ax.set_zlabel('Z')
ax.set_zlim(0, 100)
plt.show()
我一直在使用本页中的一个填充等高线图作为模板:
目前,我能得到的最好结果就是改变轮廓的alpha值。我还尝试在等高线之后绘制曲面,但这并没有改变任何东西
任何建议都欢迎 您遇到的问题是matplotlib中的一个众所周知的问题。引述: 据我所知,所有的3D绘图都是一种技巧 问题归结为一个接一个地绘制连续的曲面块,这样每个曲面块要么完全位于其他曲面块的后面,要么完全位于其他曲面块的前面。这意味着任何两个对象只能从特定角度正确绘制,并且不能保证所有对象都会以合理的兴趣角度以正确的顺序绘制 人们可能会认为,为各种对象设置
zorder
属性可能会影响结果,但是
将绘图拆分为“上面”和“下面”是以某种神秘的方式确定的
Axes3D忽略了zorder,并按其认为应该的顺序绘制艺术家
这表现在各种3d绘图中,例如何时、甚至(尽管可以预期在单个函数调用中更容易确定绘图顺序)
对于使用单个命令绘制的曲面(即包含单个
Poly3DCollection
),可以使用set_zsort()
方法向matplotlib提供有关首选打印顺序的非常粗略的提示。除此之外,您唯一的选择是移动曲面和视角(如果可能的话),使问题不可见,或者至少不完全明显。@tcaswell提出的另一个选项是代替mplot3d(但我自己从来没有这样做过)。您的代码没有运行:未知投影“3d”
我刚刚从mpl\u工具包中添加了。mplot3d导入Axes3D
,以便使此mwe工作。对此表示歉意。。。我已经编辑了这个问题。对我来说,它看起来像一个bug。我设法重现了您的问题,但即使设置了zorder
,也无法使轮廓显示在曲面后面。问题仍然与轮廓的所选偏移无关,该偏移具有zdir='y'
好的,谢谢。我试过使用未填充的轮廓,效果很好。尽管我更喜欢填好的