我试图用plot_surface命令在matplotlib中的相同轴上绘制两个3D表面 .
fig = plt.figure()
fig.figsize = fig_size
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True)
surf = ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True)
我遇到的问题是,在查看绘图时,并不总是正确的表面是“在顶部”,例如在图中:
在后角(200N,轴上为2.5Hz),当实际上黄色 - 红色更靠近观察者时,蓝绿色表面位于“顶部” . 如果我旋转图:
那么事情看起来还不错,蓝绿色表面位于200N和2.5Hz(现在在左侧)的黄红色表面下方 . 我尝试过搜索stackoverflow和Google,但找不到解决方案的任何类似问题 .
我在Linux上使用Python 2.7.3,Numpy 1.6.1和Matplotlib 1.1.1rc .
3 回答
这就像绘画一样 . 哪一个'在顶部'取决于你最后绘制的那个 .
您可能希望使用 zorder 属性来告诉matplotlib表面的绘制顺序 .
例如:
Update :
我已经运行了几个测试,我相信它是matplotlib的 bug ,同时在一个图中绘制多个表面 . 例如,它使我们的3D世界中不应存在的一些表面如:
,尝试后我看不到有效的解决方案 . 正如我所说,因果关系是绘画的顺序: matplotlib always paints things one by one . 如果表面的一部分应位于顶部,而另一部分应位于底部,则matplotlib将出错 .
因此我的建议是停止解决这个问题,除非你想为matplotlib做贡献,否则浪费时间 . 如果你有必要解决这个问题,我建议你去找另一个绘图工具来完成你的工作 .
matplotlib FAQ here中记录了此行为 . 同一页建议安装Mayavi,它可以正常使用3D绘图 .
它的界面与matplotlib非常相似 .
它的主要问题是在python 3上安装它仍然很棘手 . (现在变得更容易了)
这是一个演示“matplotlib vs mayavi”比较:
可以手动修复此问题 . 它显然不是最干净的解决方案,但它可以满足您的需求 . 假设你想为常见的X和Y绘制Z1和Z2 .
创建一个数组Z1_gte,它是Z1的副本,其中Z1> = Z2,否则为np.nan .
创建一个数组Z1_lte,它是Z1的副本,其中Z1 <= Z2,否则为np.nan .
按以下顺序绘制三个曲面:Z1_lte,Z2,Z1_gte . 沿z轴从高到低查看时,表面看起来是正确的 . 如果您希望沿z轴从低到高查看表面看起来正确,请反转顺序 .
或直接:
该方法的明显缺点是它仅适用于沿z轴的一个特定观察方向 .