Bla*_*air 29 python matplotlib mplot3d
我试图从海底500米乘40米部分的声纳数据绘制海底的3D图像.我正在使用带有Axes3D的matplotlib/mplot3d,我希望能够更改轴的纵横比,以便x&y轴可以缩放.生成数据而不是实际数据的示例脚本是:
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# Create figure.
fig = plt.figure()
ax = fig.gca(projection = '3d')
# Generate example data.
R, Y = np.meshgrid(np.arange(0, 500, 0.5), np.arange(0, 40, 0.5))
z = 0.1 * np.abs(np.sin(R/40) * np.sin(Y/6))
# Plot the data.
surf = ax.plot_surface(R, Y, z, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)
# Set viewpoint.
ax.azim = -160
ax.elev = 30
# Label axes.
ax.set_xlabel('Along track (m)')
ax.set_ylabel('Range (m)')
ax.set_zlabel('Height (m)')
# Save image.
fig.savefig('data.png')
Run Code Online (Sandbox Code Playgroud)
以及此脚本的输出图像:

现在我想改变它,使得沿着轨道(x)轴的1米与范围(y)轴中的1米相同(或者根据所涉及的相对尺寸可以是不同的比率).由于数据中的相对大小,我还想设置z轴的比率,再次不一定是1:1,但是轴小于当前的图.
我已经尝试构建和使用matplotlib的这个分支,遵循来自邮件列表的此消息中的示例脚本,但是将该ax.pbaspect = [1.0, 1.0, 0.25]行添加到我的脚本中(已经卸载了'标准'版本的matplotlib以确保使用自定义版本)没有在生成的图像中没有任何区别.
编辑:因此所需的输出将类似于以下(使用Inkscape粗略编辑)图像.在这种情况下,我没有在x/y轴上设置1:1的比例,因为它看起来非常薄,但我已经将它展开,因此它不像原始输出那样是正方形.

HYR*_*YRY 22
在savefig之前添加以下代码:
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
Run Code Online (Sandbox Code Playgroud)

如果你不想要方轴:
编辑get_projsite-packages\mpl_toolkits\mplot3d\axes3d.py中的函数:
xmin, xmax = np.divide(self.get_xlim3d(), self.pbaspect[0])
ymin, ymax = np.divide(self.get_ylim3d(), self.pbaspect[1])
zmin, zmax = np.divide(self.get_zlim3d(), self.pbaspect[2])
Run Code Online (Sandbox Code Playgroud)
然后添加一行来设置pbaspect:
ax = fig.gca(projection = '3d')
ax.pbaspect = [2.0, 0.6, 0.25]
Run Code Online (Sandbox Code Playgroud)
