我一直在四处寻找答案,但我似乎无法理解为什么在我的代码中我无法将投影的轮廓显示在表面“后面”.
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()
我一直在使用此页面中的填充轮廓图之一作为模板:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#scatter-plots
目前我能得到的最好的是改变轮廓的alpha值.我也尝试在轮廓后绘制表面,但这并没有改变任何东西.
任何建议都是最受欢迎的!
解决方法:
你遇到的问题是matplotlib中一个着名的bug/missing feature.引用a co-lead developer of matplotlib:
As I understand it all the 3D plotting as a bit of a hack.
问题归结为一个接一个地绘制连续的曲面块,使得每个曲面完全位于其他任何一个之后,或完全位于其前面.这意味着任何两个对象仅从特定角度正确绘制,并且无法保证所有对象都将以合理的感兴趣角度以正确的顺序绘制.
有人会认为为各种对象设置zorder属性会影响结果,但是this is not the case,因为
splitting up the plotting is that ‘above’ and ‘below’ are determined in a some what arcane way
Axes3D ignores zorder and draws artists in the order it thinks they should be.
这表现在各种各样的3d图中,例如plotting text with surfaces,plotting complicated surfaces甚至plotting 3d bar plots(尽管人们可以预期在单个函数调用中更容易确定绘图顺序).
对于使用单个命令绘制的曲面(即包含单个Poly3DCollection的曲面),您可以使用set_zsort()方法为matplotlib提供关于首选绘图顺序的非常粗略的提示.除此之外,您唯一的选择是移动您的表面和视角(如果可能的话),使问题不可见,或者至少不完全明显. @tcaswell提出的另一种选择是to use mayavi而不是mplot3d(但我自己从未这样做过).