我正在尝试从 遍及海底500m x 40m的声纳数据绘制海底3D图像。我将Matplotlib / mplot3d与 Axes3D配合使用,并且希望能够更改轴的纵横比,以便 按比例缩放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')
以及此脚本的输出图像:
matplotlib输出图像
现在,我想对其进行更改,以使沿轨迹(x)轴 的1米与范围(y)轴的1米相同(或 取决于所涉及的相对大小,其比率可能不同)。我还想设置 z轴的比例,由于 数据的相对大小,也不必将其设置为1:1 ,但是该轴小于当前图。
我已经尝试了构建和使用的这个分支 matplotlib, 在下面的示例脚本从邮寄这个消息 列表, 但增加了ax.pbaspect = [1.0, 1.0, 0.25]行给我的脚本(已 卸载matplotlib的“标准”版本,以确保定制的版本 正在使用)没不会对生成的图像产生任何影响。
编辑:因此所需的输出将类似于以下 图像(使用Inkscape进行了详细编辑)。在这种情况下,我没有在x / y 轴上设置1:1的比例,因为它看起来太稀薄了,但是我将其散开了,因此 与原始输出不一样。
Add following code before savefig:
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
If you want no square axis:
edit the get_proj function inside site- packages\mpl_toolkits\mplot3d\axes3d.py:
get_proj
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])
then add one line to set pbaspect:
ax = fig.gca(projection = '3d') ax.pbaspect = [2.0, 0.6, 0.25]