我试图从声纳运行的数据绘制海底的3D图像,该数据覆盖500米乘40米的海底部分。我使用matplotlib/mplot 3d和Axes 3D,我希望能够更改轴的纵横比,以便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,但轴比当前图小。
我尝试过按照this message from the mailing list中的示例脚本构建和使用this branch of matplotlib,但是在我的脚本中添加ax.pbaspect = [1.0, 1.0, 0.25]
行(已经卸载了matplotlib的“标准”版本以确保使用自定义版本)并没有在生成的图像中产生任何差异。
**编辑:**因此,所需的输出将类似于以下(使用Inkscape粗略编辑)图像。在这种情况下,我没有在x/y轴上设置1:1的比例,因为这看起来非常薄,但我已经将其展开,因此它不像原始输出那样是方形的。
5条答案
按热度按时间myzjeezk1#
在savefig之前添加以下代码:
如果你不想要方形轴:
编辑site-packages\mpl_toolkits\mplot 3d\axes3d.py中的
get_proj
函数:然后添加一行设置pbaspect:
gpfsuwkq2#
this question的答案非常适合我。你不需要设置任何比率,它会自动完成所有事情。
unguejic3#
在github上有一个问题:https://github.com/matplotlib/matplotlib/issues/8593
上面的解决方案似乎不再起作用了。现在必须按以下方式编辑
site-packages\mpl_toolkits\mplot3d\axes3d.py
中的get_proj
函数:toe950274#
这就是我解决浪费空间问题的方法:
hujrc8aj5#
现在只需要在这里声明完整的解决方案。Axes3D.set_box_aspect
完整代码:
Resulting plot image
感谢@ImportanceOfBeingErnest提供问题和答案。