ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python/matplotlib】matplotlibを使ってグラフを作成してみる

 過去の記事でmatplotlibを使って最小二乗法で数式を推定する記事を書きました。

 それからかなり時間が経過しmatplotlibの使い方についてほとんど忘れてしまっているのと、当時はどこまでライブラリでできるのかを全く把握せずに使っていたので、改めて色々触っていこうと思い記事にした次第です。
 前の記事と重複する部分もあるかと思いますが、最初からやっていきます。


 では、始めます。


1:matplotlibのインストール
 pipが入っていれば以下のコマンドを実行するだけでインストールできます。

$ pip install matplotlib

 インストールが完了したらpythonをコンソール上で立ち上げて、以下のコマンドでバージョン確認をします。

import matplotlib
matplotlib.__version__

 実際に行うと以下のようにバージョンが表示されます。自分の環境では3.6.2です。

 ここで注意なのですが、以下の公式リリースのページにあるようにmatplotlibのバージョンは割と更新が早いです。

 matplotlibのバージョンによっては他の方のブログ記事などのソースコードがそのまま動かない可能性もあります(自分の場合もエラーが出たりしました)。

 以降の内容はmatplotlibのバージョンが「3.6.2」という前提で進めるので、以下のようにバージョンを指定して改めてインストールするか、エラーが出た場合は個別に解決するようにお願いします。

$ pip install matplotlib==3.6.2


2:matplotlibを使って2次元グラフ作成
 ではとりあえずx軸とy軸の2次元散布図グラフを作ってみます。

・xy_graph_test.py

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

def main():
  # x, yのデータ
  x_data = [180,211,224,235,247,256,265,271,275,279,284,287,289]
  y_data = [357,337,329,322,315,311,305,301,298,295,293,293,290]

  # グラフオブジェクト。200dpiなので縦横がそれぞれ「3*200=600 pixel」の大きさになる
  fig = plt.figure(figsize=(3, 3), dpi=200)

  # グラフの余白設定
  fig.subplots_adjust(left=0.2, right=0.9, bottom=0.15, top=0.9)

  # 1行1列の1番目の位置にグラフを指定
  ax = fig.add_subplot(1, 1, 1)

  ax.scatter(x_data , y_data)  # 散布図作成

  ax.set_title("test_title") # グラフタイトル
  ax.set_xlim(min(x_data)-10, max(x_data)+10) # x軸の最小値、最大値を設定
  ax.set_ylim(min(y_data)-10, max(y_data)+10) # y軸の最小値、最大値を設定
  ax.set_xlabel("x_data") # x軸の名前を設定
  ax.set_ylabel("y_data") # y軸の名前を設定

  # ax.axis("off") # これを設定するとグラフタイトル以外の軸線などが全てクリアされる

  plt.savefig("./xy_graph.png") # グラフを画像として保存(showより前に実行しないと画像が真っ白になる)
  plt.show()                    # グラフを表示

if __name__ == '__main__':
    main()

 このソースコードを実行すると以下のようなmatplotlibのGUI画面が表示されます。

 またソースコードと同じ階層に「xy_graph.png」としてGUIで表示されたグラフと同じ内容の画像が保存されます。

 処理内容としてはソースコードの中身を見れば大体わかると思います。「ax.axis("off")」の行のコメントアウトを外すと以下のようにグラフタイトル以外の軸などが表示されなくなります。


3:matplotlibを使って3次元グラフ作成
 2次元だけではなく3次元散布図グラフも作成できるのでやってみます。

・3d_graph_test.py

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

def main():
  # x, y, zのデータ
  x_data = [180,211,224,235,247,256,265,271,275,279,284,287,289]
  y_data = [357,337,329,322,315,311,305,301,298,295,293,293,290]
  z_data = [279,278,279,279,281,281,282,282,284,285,286,288,290]

  # グラフオブジェクト。200dpiなので縦横がそれぞれ「3*200=600 pixel」の大きさになる
  fig = plt.figure(figsize=(3, 3), dpi=200)

  # グラフの余白設定
  fig.subplots_adjust(left=0.1, right=0.78, bottom=0.15, top=0.9)

  # 1行1列の1番目の位置に3dグラフを指定
  ax = fig.add_subplot(1, 1, 1, projection='3d')

  ax.scatter(x_data , y_data, z_data)  # 散布図作成

  ax.set_title("3d_test_title") # グラフタイトル
  ax.set_xlim(min(x_data)-10, max(x_data)+10) # x軸の最小値、最大値を設定
  ax.set_ylim(min(y_data)-10, max(y_data)+10) # y軸の最小値、最大値を設定
  ax.set_zlim(min(z_data)-10, max(z_data)+10) # z軸の最小値、最大値を設定
  ax.set_xlabel("x_data") # x軸の名前を設定
  ax.set_ylabel("y_data") # y軸の名前を設定
  ax.set_zlabel("z_data") # z軸の名前を設定

  # ax.axis("off") # これを設定するとグラフタイトル以外の軸線などが全てクリアされる

  plt.savefig("./3d_graph.png") # グラフを画像として保存(showより前に実行しないと画像が真っ白になる)
  plt.show()                    # グラフを表示

if __name__ == '__main__':
    main()

 2次元の時のソースコードと違うのはzのデータを追加しているのと、subplots_adjust関数の引数に「projection='3d'」を追加しているぐらいです。その他は細かい調整などです。

 実際に実行すると以下のようにmatplotlibのGUI画面が表示されます。

 また今回は3次元なのでマウスの左クリックを押した状態で動かすと、グラフを見る視点を変更できます。

 ちなみに実行時に作成される「3d_graph.png」画像はGUIのように動かせないため、一番最初にGUIに表示された視点からのグラフとして保存されます。


 以上がmatplotlibを使ってグラフを作成してみた備忘録になります。

 初めて3次元のグラフを作ってみましたが、デフォルトのGUI上でグリグリ動かせるのには驚きました。

 デフォルトのGUIそのままでもそれなりに機能が多いので、うまく使いこなしてみたいです。


・参考資料