ライブラリMatplotlib入門(データの可視化・グラフ化)
Matplotlib(マットプロットリブ)は、 Python用のデータ可視化ライブラリ です。数式をグラフで表示したり、棒グラフや散布図を描いたり、画像データの表示をすることが可能で、Pandasライブラリよりも高度にデータを可視化できます。また、機械学習で画像認識を行う場合にも、学習用の画像データの確認のためによく使われます。
この教材は入門であるため、下記では簡単な例しか挙げていません。matplotlibはもっといろいろな種類のグラフやいろいろな装飾(色の指定や目盛り線の表示など)ができますので、各自で調べてみましょう。
また、Python用のデータ可視化ライブラリとしては他に、Matplotlibよりも高機能なSeabornライブラリもあります。seabornライブラリに関しては、ネットにも多くの情報があるので、各自で調べてみてください。
(参考)
-
Matplotlib 公式ページ https://matplotlib.org/
- サンプル https://matplotlib.org/stable/plot_types/index.html
- 各種グラフリファレンス
-
Seaborn 公式ページ https://seaborn.pydata.org/
1.準備
matplotlibは外部ライブラリなので、インストールをしてください。(参考:外部ライブラリのインストール方法) インストール後は、プログラム中で下記のようにimportをして使うことができます。
import matplotlib.pyplot as plt
2.数式をグラフで可視化
のグラフを描く[plt.plot(x, y)]
関数のグラフを描くには、 plt.plot(x, y) を使います。
import numpy as npimport matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.1) #-20から20まで0.1区切りで配列を作る。y = x**2
plt.plot(x,y)plt.show()
、 のグラフを描く[plt.plot(x, y)]
1つの図の中に複数のグラフを描くこともできます。
import numpy as npimport matplotlib.pyplot as plt
PI = np.pi # 円周率をPIで使えるようにする。PI=3.1415・・・x = np.arange(0, 2*PI, 0.1) #0から2π(=6.283・・・)まで0.1区切りで配列を作る。y1 = np.sin(x) #配列xの値に関してそれぞれsin(x)を求めてy軸の配列を生成y2 = np.cos(x) #同様に、cos(x)を求めてy軸の配列を生成
plt.plot(x,y1) #sin 青plt.plot(x,y2) #cos オレンジplt.show()
3.データをグラフで可視化
折れ線グラフを描く[ plt.plot(x, y) ]
各月の気温など、折れ線グラフで可視化すると分かりやすいでしょう。折れ線グラフを描くには、 plt.plot(x, y) を使います。
import matplotlib.pyplot as plt
x=["Jan.","Feb.","Mar.","Apr.","May","Jun.","Jul.","Aug.","Sep.","Oct.","Nov.","Dec."]data1= [7.1, 8.0, 9.6, 17.1, 20.0, 23.1, 28.7, 29.0, 26.6, 20.6, 13.7, 8.1]
plt.plot(x,data1)plt.show()
# data1 : 2024年東京 日平均気温の月平均値(℃)
棒グラフを描く[ plt.bar( ) ]
各月の降水量など、棒グラで可視化すると分かりやすいでしょう。棒グラフを描くには plt.bar(x, y) を使います。
import matplotlib.pyplot as plt
x=["Jan.","Feb.","Mar.","Apr.","May","Jun.","Jul.","Aug.","Sep.","Oct.","Nov.","Dec."]data2= [36.0, 78.5, 188.5, 115.5, 201.5, 350.0, 206.5, 381.0, 111.5, 174.5, 82.0, 0.5]
plt.bar(x,data2)plt.show()
# data2 : 2024年東京 降水量の月合計値(mm)
※出典:気象庁 「東京(東京都) 2024年(月ごとの値) 主な要素」
散布図を描く[ plt.scatter(x, y) ]
その日の気温とアイスクリームの売上数など、x値(気温)とy値(売上数)の組になっているデータを可視化するには、散布図が便利です。散布図を描くには、 plt.scatter(x, y) を使います。
import matplotlib.pyplot as plt
x = [31.5, 25.1, 32.0, 22.5, 32.5, 26.4, 29.0, 23.2, 18.3, 27, 35.0, 25.2, 18.4, 27.6, 27.9, 20.1, 29.2, 22.5]y = [95, 90, 105, 70, 98, 80, 94, 85, 61, 77, 110, 73, 56, 83, 90, 69, 85, 77]
plt.scatter(x,y)plt.show()
箱ひげ図を描く[ plt.boxplot(x) ]
データの分布や値のばらつきを可視化するには、箱ひげ図が便利です。箱ひげ図を描くには、 plt.boxplot() を使います。
なお、下記では2つのデータを比較するために、2つの箱ひげ図を一つのグラフに表示しています。そのため、 plt.boxplot( )
の引数として、mathデータとenglishデータを合わせてリストにした [math,english]
を入れて plt.boxplot([english, math])
としています。一つだけ表示するなら、 plt.boxplot( english )
でOKです。
import matplotlib.pyplot as plt
# 英語の点数english = [77, 92, 62, 77, 64, 45, 28, 60, 37, 86]# 数学の点数math = [82, 75, 50, 73, 65, 95, 78, 93, 71, 83]
plt.grid() # 横線ラインを入れることができます。plt.boxplot([english, math])plt.xticks([1,2],["English", "Math"]) # x軸のラベルを書き換えますplt.show()
注)上図のMathの所にある白丸は「外れ値」です。「外れ値」についても各自で調べてみましょう。
[参考]
Python matplotlibで箱ひげ図を描画しよう!(AI Academy)
4.画像データを可視化
画像ファイル、もしくは画像情報を格納した配列データを基に、画像を表示します。matplotlibは、普通に画像ファイルを表示するのにも使われますが、機械学習などで学習用データやテスト用データ(これらは配列データになります)を目で直接確認したいときによく使います。
matplotlibは、.jpg、.png形式などの画像ファイルを読み込む機能は持っていません。このため、これらの形式の画像ファイルを読み込むためには、 Pillow や OpenCV などの画像用ライブラリをimportして使います。以下では、Pillowライブラリを使った例で説明します。
画像ファイルを読み込んで画像を表示
一般的な画像ファイルを表示する方法です。
<パターン>
image = Image.open("画像ファイル名") #.jpg .png のファイルなどを読み込む
plt.imshow(image)plt.show()
例
import numpy as npimport matplotlib.pyplot as pltfrom PIL import Image #Pillowライブラリをimportし、Image.open()を使えるようにします。
image = Image.open("test.jpg")
plt.imshow(image)plt.show()
画像ファイルで画像表示
配列データを基に画像表示
機械学習では、学習用データ等が画像ファイルではなく、 numpy配列のデータ として提供されている場合があります。numpy配列のデータであっても、imshowメソッドでは画像ファイルの場合と同様に下記の書き方で表示することができます。
<パターン>
plt.imshow(配列変数名)plt.show()
下記は、MNISTの学習用データ(numpy配列)を画像で表示する例です。(”確認したい学習用データの番号を指定する”のところで番号を変えてみてください)
import tensorflow as tfimport matplotlib.pylab as pltimport numpy as np
#1.学習用データの準備print("\n*** 学習データ読み込み ***")(x_train,y_train), (x_test,y_test) = tf.keras.datasets.mnist.load_data()print(x_train.shape) # x_trainはnumpy配列のデータn = 0 # 確認したい学習用データの番号を指定するprint(x_test[n])plt.imshow(x_test[n],cmap='Greys')plt.show()
※実行するには、tensorflow、matplotlib、numpyの外部ライブラリを自分のPCのPythonエディタにインストールしておくか、もしくは Google Colaboratory など(クラウドなので、ユーザーはインストール作業不要)で実行してください。
学習用データ0番の場合
画像ファイルをnumpy配列のデータに変換して表示
これは Matplotlib の機能ではありませんが、機械学習のための画像処理の場面で出てくることがあるので、ここに掲載します。
機械学習においては、画像ファイル(.jpgや.png)のデータそのままでは処理できませんので、numpyの配列(ndarray)に変換する必要があります。このためには、画像ファイルをImage.open()で読み込んで、それをnp.array()に渡します。すると、形状shapeが( 行(高さ), 列(幅), 色(チャンネル))の三次元の配列ndarrayが得られます。この配列も、前項のようにimshowで表示することができます。
例
import numpy as npimport matplotlib.pyplot as pltfrom PIL import Image
image = Image.open("test.jpg")image_array = np.array(image) # 画像ファイルのデータをnumpyの配列データに変換
plt.imshow(image_array)plt.show()
※実行するには、numpy、matplotlib、Pllow(PIL)の外部ライブラリを自分のPCのPythonエディタにインストールしておくか、もしくは Google Colaboratory など(クラウドなので、ユーザーはインストール作業不要)で実行してください。
numpy配列のデータで画像表示
参考資料: 「 pyplot.imshow – 画像表示」,tau, http://taustation.com/pyplot-imshow/