我正在使用Matplotlib将一些数据绘制为3D表面图。我使用的代码与此3D surface plot example非常相似。它生成如下所示的图:
此图的问题是Z轴不是垂直的。如何使Z轴垂直?
我检查了可用的不同API并找到了view_init。通过使用elev=1
设置绘图的低高程(view_init
),我可以将Z轴设置为垂直,如下所示:
但是,这里的问题是在低海拔时,Y轴刻度标签都被覆盖,无法正确查看。所以我需要绘图处于高海拔并且X-Y平面旋转角度如图1所示。如何为此绘图实现垂直Z轴?
我不知道Matlab,但我知道Matplotlib源自Matlab API。因此,我查看了Matlab文档中的曲面图示例,发现Z轴在它们的示例中似乎是垂直的。下图显示了一个高海拔图示:
更新1:根据Bentoy13的建议,我设置view_init(elev=30, azim=-37.5)
并获得以下结果。它更好,但还不是垂直的:
相比之下,Matlab图中的Z轴是完全垂直的。此外,从这个角度可以看出,我实际上无法使用此azim=-37.5
,因为隐藏了一些信息。还有其他方法吗? : - )
答案 0 :(得分:2)
在Matlab文档中给出的示例中,表面图通常在特殊位置查看,该位置由命令view
给出:
view(3)
命令view
设置轴的视点。根据文档,view(3)
设置默认的三维视图,方位角= -37.5,高程= 30。
修改强>
具有垂直z轴的问题不是轴是垂直的,而是透视问题。默认情况下,Matlab使用正交投影绘制3D曲面,但matplotlib似乎使用透视投影绘制。遗憾的是,matplotlib没有提供用于设置此...的API ...
编辑2
以下补丁似乎对于在正投影中绘制3D非常有用:
import numpy
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
a = (zfront+zback)/(zfront-zback)
b = -2*(zfront*zback)/(zfront-zback)
return numpy.array([[1,0,0,0],
[0,1,0,0],
[0,0,a,b],
[0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj
我不赞成这个补丁,你可以找到它here。
答案 1 :(得分:0)
在MPL 2.1.0 1中,他们添加了手动覆盖投影的选项,以生成具有正交投影的3d图形。只需在脚本中插入以下行即可:
ax.set_proj_type('ortho')
[来自MPL来源1的示例]
1 https://matplotlib.org/users/prev_whats_new/whats_new_2.1.0.html