海底の 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')
そして、このスクリプトからの出力画像:
ここで、トラックに沿った (x) 軸の 1 メートルが範囲 (y) 軸の 1 メートルと同じになるように変更したいと思います (または、関連する相対的なサイズに応じて異なる比率になる可能性があります)。また、データの相対的なサイズのために、z 軸の比率を 1:1 にする必要はありませんが、軸は現在のプロットよりも小さく設定したいと思います。
メーリングリストからのこのメッセージのサンプルスクリプトに従って、matplotlib のこのブランチを構築して使用しようとしましたが、スクリプトに行を追加しました(カスタムバージョンが使用されていることを確認するために、matplotlib の「標準」バージョンをアンインストールしました) 。生成された画像に違いはありません。ax.pbaspect = [1.0, 1.0, 0.25]
編集:したがって、望ましい出力は次のようなものになります(Inkscapeで大雑把に編集された)画像。この場合、x/y 軸に 1:1 の比率を設定していません。