33

海底の 500m x 40m の部分で実行されたソナーのデータから、海底の 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')

そして、このスクリプトからの出力画像:

matplotlib の出力画像

ここで、トラックに沿った (x) 軸の 1 メートルが範囲 (y) 軸の 1 メートルと同じになるように変更したいと思います (または、関連する相対的なサイズに応じて異なる比率になる可能性があります)。また、データの相対的なサイズのために、z 軸の比率を 1:1 にする必要はありませんが、軸は現在のプロットよりも小さく設定したいと思います。

メーリングリストからのこのメッセージのサンプルスクリプトに従って、matplotlib のこのブランチを構築して使用しようとしましたが、スクリプトに行を追加しました(カスタムバージョンが使用されていることを確認するために、matplotlib の「標準」バージョンをアンインストールしました) 。生成された画像に違いはありません。ax.pbaspect = [1.0, 1.0, 0.25]

編集:したがって、望ましい出力は次のようなものになります(Inkscapeで大雑把に編集された)画像。この場合、x/y 軸に 1:1 の比率を設定していません。

望ましい出力

4

4 に答える 4

26

savefig の前に次のコードを追加します。

ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])

ここに画像の説明を入力

正方形の軸が必要ない場合:

get_projsite-packages\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])

次に、1 行追加して pbaspect を設定します。

ax = fig.gca(projection = '3d')
ax.pbaspect = [2.0, 0.6, 0.25]

ここに画像の説明を入力

于 2012-04-26T06:15:51.203 に答える
7

この質問への答えは私にとって完璧に機能します。また、比率を設定する必要はありません。すべてが自動的に行われます。

于 2013-09-26T10:42:57.563 に答える