死んだ魚の目

Web放浪記

pyplotでグラフのアスペクト比を揃える

yutoritelepath.hatenablog.com

ベクトル描画の記事でグラフを描きましたが、よく見るとxy軸のアスペクト比がおかしいですね。 f:id:yutoritelepath:20181122180757p:plain

アスペクト比を揃える方法はオフィシャルサイトに記事がありました。

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()を使っています。

結果がこちら。ちゃんとアスペクト比が揃っています。

f:id:yutoritelepath:20181123034720p:plain