的三维曲线设定纵横比的三维曲线设定纵横比(Setting aspect ratio of 3D pl

2019-05-13 15:28发布

我想通过海底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轴,因为看起来可笑薄,但我已扩散出来,所以它不是正方形上的原始输出。

Answer 1:

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]



Answer 2:

在回答这个问题的作品完美的我。 而你并不需要设置任何比例,它会自动做的一切。



Answer 3:

我不知道怎么解决了浪费空间的问题:

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))


文章来源: Setting aspect ratio of 3D plot