[Python]Matplotlibの基本的な関数まとめ

Python
スポンサーリンク

Matplotlibとは

Matplotlibとは、NumPyの配列(ndarray)に格納されたデータをグラフなどに可視化するためのライブラリです。Pythonで使えるgnuplotのようなものです。元々は、MATLABユーザーのために、Pythonで代替で書けるようにするために生まれたものらしいです。
Matplotlibは、宇宙望遠鏡科学研究所(ハッブル宇宙望遠鏡の開発など)で採用されたことがきっかけで広まって、現在ではPythonにおいて覚えるべき重要な事項のひとつになりました。

オブジェクト指向的にグラフを描けるため、非常にシンプルにグラフ描画を実現できます。

当記事では、そんなMatplotlibを使いこなすうえで、基本となる関数を紹介いたします。

Matplotlibの基本的な使用方法

はじめに

事前にMatplotlibがインストールされているか確認してください。pip listもしくはconda listなどで確認できます。もし無ければ、自身の環境に合わせてインストールしてください。

前提として、二次元の散布図を描くための基本的な関数を紹介いたします。当記事では三次元グラフ、ヒストグラムの描き方は紹介いたしませんが、以下で紹介する関数は、それらのグラフにも応用できます。

グラフの表示方法

ひとまず一例として三角関数sin(x)とcos(x)のグラフを表示してみます。ソースコードのコメントアウトに解説も残しているので併せてご覧ください。

#Matplotlibでグラフを描くためにはnumpyとmatplotlib.pyplotをインポートする
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50) #0から10までを50分割した数字の配列を生成。[0, 0.2, 0.4, 0.6,...]

plt.plot(x, np.sin(x)) #plt.plot(横軸, 縦軸)でプロットが出来る。sin(x)のプロット
plt.plot(x, np.cos(x)) #cos(x)のプロット
plt.savefig('testplot.png') #plt.savefig(画像名)で画像の保存
plt.show() #plt.show()でグラフを表示
##豆知識 savefigの前にshowしてしまうと、プロットのデータが飛んでしまい、
##真っ白なグラフが表示されてしまうので、基本的にshowは一番最後に書く

ちなみにsavefig()で保存できるファイル形式は以下の通りです。

eps: Encapsulated Postscript
jpeg: Joint Photographic Experts Group
jpg: Joint Photographic Experts Group
pdf: Portable Document Format
pgf: PGF code for LaTeX
png: Portable Network Graphics
ps: Postscript
raw: Raw RGBA bitmap
rgba: Raw RGBA bitmap
svg: Scalable Vector Graphics
svgz: Scalable Vector Graphics
tif: Tagged Image File Format
tiff: Tagged Image File Format

グラフの細かい設定

上のソースコードでは、単純にプロットしたデータをそのまま出力するだけでした。
実際に利用する際には、グラフの各種要素を設定し、詳細な表示をする必要があります。
次に書くソースコードでは、

  • 点のスタイル
  • 線のスタイル
  • 線の色
  • 凡例
  • 軸目盛の範囲
  • グラフタイトル
  • 軸ラベル
  • グリッド線の追加

の設定方法を示しています。ぜひコピペして試してみてください。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)

plt.plot(x, np.sin(x), 'o', linestyle='-' , color='b', label='$sin(x)$') #'-'=solid  '--'=dashed  '-.'=dashdot  ':'=dotted
plt.plot(x, np.cos(x), linestyle='--', color='r', label='$cos(x)$') #rgb cmyk(Cyan Magenta Yellow blacK)

plt.xlim(0, 10) #軸目盛りのリミットを決められる
plt.ylim(-1.5, 1.5) #plt.axis([x_min, x_max, y_min, y_max])でも可能
#plt.axis('tight') #勝手に軸を自動的に狭めてくれる
plt.title("Sine Curve and Cosine Curve") #タイトル
plt.xlabel("x") #x軸ラベル
plt.ylabel("y") #y軸ラベル
plt.legend() #plt.plotで設定した凡例の表示
plt.grid(linestyle='--') #グリッド線の追加 linestyleを指定しない場合、普通の線が出る
#plt.axis('equal') #目盛りのアスペクト比を統一する

plt.savefig('./figure/testplot1.png')
plt.show()

plot()の引数について

plt.plot()では、以下のようなプロットの詳細設定が可能です。

  • 点のスタイル
  • 線のスタイル
  • 凡例

それぞれ引数の指定について説明します。

  • 点のスタイル
    o : ●
    . : ・
    , : .
    x : ×
    +: +
    v : ▽
    ^: △
    <: ◁
    >: ▷
    s : □
    d: ♢
    指定しない場合は点が描かれない


  • 線のスタイル
    linestyle = ”で指定可能
    – : 普通の線
    –: -----------
    -. : -・-・-・-・-・-
    : : ・・・・・・・・・・・
    指定しない場合は普通の線になる。



  • color = ”で指定可能。
    rgbやcmykで指定できる他、”red”など色の名前や、Hex code、RGB値を入れたタプルなど様々な表現方法がある。
    指定しない場合は勝手に決めてくれる。


  • 凡例
    label = ”で指定可能。
    $$を加えるとLaTeX表記が可能になり、下付き文字やギリシャ文字などが書ける。
    実際に凡例をグラフに表示するためには、後にplt.legend()を書く必要がある。

グラフを重ねずに別々で表示

別々で表示したい場合は、plt.subplots(行, 列, グラフ番号)を使えばよいのですが、行と列で設定して出来た配列をいちいち気にする手間が増え、非常に面倒なのでオブジェクト指向言語ならではの工夫をちょっとします。

fig, ax = plt.subplots(グラフの個数) と書くことで、figには描画領域のオブジェクト、axにはpltと似たオブジェクトが返されます。なお、axで使える関数はpltとほぼ同じですが、注意点としてplt.titleなどのように文字列を書き込む関数においては、ax[ ].set_titleと”set_”を書き加える必要があります。

plt.subplots()を用いて、先ほどと同様なグラフを描くソースコードは以下のようになります。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2) #plt.subplotの引数はグラフの個数。figには描画領域のオブジェクト、axはpltと似たオブジェクト

x = np.linspace(0, 10, 50)

ax[0].plot(x, np.sin(x), 'o', linestyle='-' , color='b', label='$sin(x)$')
ax[1].plot(x, np.cos(x), linestyle='--', color='r', label='$cos(x)$')

ax[0].set_title("Sine Curve") #タイトル
ax[1].set_title("Cosine Curve")
for i in range(len(ax)): #2つのグラフそれぞれにラベルや凡例など設定する為にforを用いている。
    ax[i].axis([0, 10, -1.5, 1.5]) #目盛りの範囲を指定
    ax[i].set_xlabel("x") #x軸ラベル
    ax[i].set_ylabel("y") #y軸ラベル
    ax[i].legend() #ax[].plotで設定した凡例の表示
    ax[i].grid(linestyle='--')

plt.subplots_adjust(hspace=0.7) #これを書かないとグラフ同士が変に重なるので間隔を調整するために書く。wspaceで横幅の間隔も指定可能。
plt.savefig('testplot2.png')
plt.show()




マスルキン

当ブログ管理人のマスルキンです。

高専電気系学科に5年間在籍。卒業後は専攻科に進学し現在に至る。

生まれつき聴覚障害があり
補聴器の使用、コミュニケーションでは読唇や手話などを用いています。

当ブログでは
・プログラミング・研究関係の備忘録
・趣味(筋トレ、カメラ、プラモデル、etc...)
・自身の日常
などを自由気ままに皆様に発信いたします。

記事が皆様のお役に立てば幸いです。

マスルキンをフォローする
Python プログラミング
スポンサーリンク
マスルキンをフォローする
マスルキンの部屋

コメント

タイトルとURLをコピーしました