我想通过海底40米部分绘制从声纳碾过500米的的数据海底的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')
而从这个脚本的输出图像:
现在我想改变它,以便1米沿轨迹(x)的轴是相同的范围(y)轴1米(或也许取决于所涉及的相对大小不同的比率)。 我还要设定z轴的比例,又不neccessarily至1:1,由于在该数据的相对大小,但这样的轴比当前情节小。
我已经尝试了构建和使用matplotlib的这个分支 ,在以下示例脚本从邮件列表此消息 ,但添加的ax.pbaspect = [1.0, 1.0, 0.25]
线到我的脚本(已卸载的“标准”版本matplotlib确保定制版本使用)并没有使生成的图像中的任何差异。
编辑:那么所需的输出会像下面的图片(使用Inkscape粗制滥造编辑)。 在这种情况下我尚未设定1:在x 1的比例/ Y轴,因为看起来可笑薄,但我已扩散出来,所以它不是正方形上的原始输出。
savefig之前添加以下代码:
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
如果你不想要方轴:
编辑get_proj
站点包\ 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])
然后添加一条线来设置pbaspect:
ax = fig.gca(projection = '3d')
ax.pbaspect = [2.0, 0.6, 0.25]
在回答这个问题的作品完美的我。 而你并不需要设置任何比例,它会自动做的一切。
我不知道怎么解决了浪费空间的问题:
try:
self.localPbAspect=self.pbaspect
zoom_out = (self.localPbAspect[0]+self.localPbAspect[1]+self.localPbAspect[2])
except AttributeError:
self.localPbAspect=[1,1,1]
zoom_out = 0
xmin, xmax = self.get_xlim3d() / self.localPbAspect[0]
ymin, ymax = self.get_ylim3d() / self.localPbAspect[1]
zmin, zmax = self.get_zlim3d() / self.localPbAspect[2]
# transform to uniform world coordinates 0-1.0,0-1.0,0-1.0
worldM = proj3d.world_transformation(xmin, xmax,
ymin, ymax,
zmin, zmax)
# look into the middle of the new coordinates
R = np.array([0.5*self.localPbAspect[0], 0.5*self.localPbAspect[1], 0.5*self.localPbAspect[2]])
xp = R[0] + np.cos(razim) * np.cos(relev) * (self.dist+zoom_out)
yp = R[1] + np.sin(razim) * np.cos(relev) * (self.dist+zoom_out)
zp = R[2] + np.sin(relev) * (self.dist+zoom_out)
E = np.array((xp, yp, zp))