pyplotでグラフのアスペクト比を揃える
ベクトル描画の記事でグラフを描きましたが、よく見るとxy軸のアスペクト比がおかしいですね。
アスペクト比を揃える方法はオフィシャルサイトに記事がありました。
pylab_examples example code: equal_aspect_ratio.py — Matplotlib 2.0.2 documentation
以下の1行を追記するだけでいいみたいです。
plt.axes().set_aspect('equal')
記事では'datalim'も引数に指定していますが、軸のMin, Maxが自動調整で変更されてしまうのでここでは指定していません。
plt.axes()はAxesクラスのインスタンスを返します。
matplotlib.pyplot.axes — Matplotlib 3.0.2 documentation
このAxesクラスですが、オフィシャルサイトで下記のように説明されています。
axes — Matplotlib 3.0.2 documentation
The Axes contains most of the figure elements: Axis, Tick, Line2D, Text, Polygon, etc., and sets the coordinate system.
グラフの見栄えを制御するコントローラってとこでしょうか。
修正後のコードがこちら。
# coding:utf-8 import numpy as np import matplotlib.pyplot as plt def main(): # 格子点を生成 vectors = np.array([[x, y] for x in range(-5, 6) for y in range(-5, 6)]) A = np.array([[2, 0], [0, 2]]) B = np.dot(A, vectors.T) U = B[0] # x成分取り出し V = B[1] # y成分取り出し plt.quiver(vectors.T[0], vectors.T[1], U, V, angles='xy', scale=1, scale_units='xy') plt.axis([-20, 20, -20, 20]) # x軸、y軸のMin, Maxを指定 plt.axes().set_aspect('equal') # グラフのアスペクト比を揃える plt.grid() plt.show() if __name__ == '__main__': main()
ちゃっかりx軸、y軸のMin, Maxの指定に、xlim(), ylim()ではなくaxis()を使っています。
結果がこちら。ちゃんとアスペクト比が揃っています。