Sor*_*ade 5 python matplotlib surface python-2.7
我一直在寻找答案,但是我似乎看不出为什么在我的代码中我无法使投影轮廓显示在表面“背后”。
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()
Run Code Online (Sandbox Code Playgroud)
我一直使用此页面中的“填充轮廓图”之一作为模板:http : //matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#scatter-plots
目前,我能得到的最好的就是更改轮廓的alpha值。我还尝试在等高线之后绘制表面,但没有任何改变。
任何建议将是最欢迎的!
您遇到的问题是 matplotlib 中众所周知的错误/缺失功能。引用matplotlib 的联合首席开发人员的话:
据我了解,所有 3D 绘图都是一种黑客行为。
问题归结为连续的曲面块是一个接一个地绘制的,这样每个曲面要么完全位于其他曲面的后面,要么完全位于其他曲面的前面。这意味着任何两个对象只能从某些角度正确绘制,并且不能保证所有对象都将以合理的兴趣角度以正确的顺序绘制。
人们可能会认为设置zorder各种对象的属性可能会影响结果,但事实并非如此,因为
分割绘图的原因是“上方”和“下方”是以某种神秘的方式确定的
Axes3D 忽略 zorder 并按照它认为应该的顺序绘制艺术家。
这在各种 3D 绘图中都有体现,例如使用Surface 绘制文本、绘制复杂的 Surface甚至绘制 3D 条形图(尽管人们可能期望在单个函数调用中更容易确定绘图顺序)。
对于使用单个命令绘制的曲面(即包含单个命令的曲面Poly3DCollection),您可以使用该set_zsort()方法向 matplotlib 提供有关首选绘图顺序的非常粗略的提示。除此之外,您唯一的选择是以问题不可见或至少不完全明显的方式移动表面和视角(如果可能的话)。@tcaswell 提出的另一个选择是使用 mayavi而不是 mplot3d (但我自己从未这样做过)。
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |