我想绘制一个三维图像,展示在海底运行声纳时获得的数据,这些数据涵盖了一个 500 米 x 40 米的海底区域。我正在使用 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')
这个脚本生成的输出图像如下:
我想要改变它,使得沿轨迹(x)轴上的1米等于距离(y)轴上的1米(或者根据涉及到的相对尺寸使用不同的比例)。我还想设置z轴的比率,同样由于数据中的相对大小而不一定是1:1,但是使轴比当前绘图小。
我已经尝试构建并使用matplotlib的这个分支,并按照邮件列表中这个消息中的示例脚本进行操作,但是在我的脚本中添加ax.pbaspect = [1.0, 1.0, 0.25]
行(卸载了“标准”版本的matplotlib以确保使用自定义版本)没有使生成的图像发生任何变化。
编辑:因此,期望的输出应该类似于以下(使用Inkscape粗略编辑的)图像。在这种情况下,我没有在x/y轴上设置1:1的比例,因为那看起来非常细,但我已经将它展开,使其不像原始输出那样是正方形。
set_box_aspect()
。请参阅以下新答案。 - user202729