コンテンツにスキップ

ライブラリMatplotlib入門(データの可視化・グラフ化)

Matplotlib(マットプロットリブ)は、 Python用のデータ可視化ライブラリ です。数式をグラフで表示したり、棒グラフや散布図を描いたり、画像データの表示をすることが可能で、Pandasライブラリよりも高度にデータを可視化できます。また、機械学習で画像認識を行う場合にも、学習用の画像データの確認のためによく使われます。

この教材は入門であるため、下記では簡単な例しか挙げていません。matplotlibはもっといろいろな種類のグラフやいろいろな装飾(色の指定や目盛り線の表示など)ができますので、各自で調べてみましょう。

また、Python用のデータ可視化ライブラリとしては他に、Matplotlibよりも高機能なSeabornライブラリもあります。seabornライブラリに関しては、ネットにも多くの情報があるので、各自で調べてみてください。

(参考)

1.準備

matplotlibは外部ライブラリなので、インストールをしてください。(参考:外部ライブラリのインストール方法) インストール後は、プログラム中で下記のようにimportをして使うことができます。

import matplotlib.pyplot as plt

2.数式をグラフで可視化

y=x2y=x^2 のグラフを描く[plt.plot(x, y)]

関数のグラフを描くには、 plt.plot(x, y) を使います。

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.1) #-20から20まで0.1区切りで配列を作る。
y = x**2
plt.plot(x,y)
plt.show()

MPDS-02-01.png

y=sin(x)y=sin(x)y=cos(x)y=cos(x) のグラフを描く[plt.plot(x, y)]

1つの図の中に複数のグラフを描くこともできます。

import numpy as np
import 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()

MPDS-02-02.png

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年東京 日平均気温の月平均値(℃)

MPDS-02-03.png

棒グラフを描く[ 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)

MPDS-02-04.png

※出典:気象庁 「東京(東京都) 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()

MPDS-02-05.png

箱ひげ図を描く[ 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()

MPDS-02-06.png

注)上図のMathの所にある白丸は「外れ値」です。「外れ値」についても各自で調べてみましょう。

[参考]

Python matplotlibで箱ひげ図を描画しよう!(AI Academy)

4.画像データを可視化

画像ファイル、もしくは画像情報を格納した配列データを基に、画像を表示します。matplotlibは、普通に画像ファイルを表示するのにも使われますが、機械学習などで学習用データやテスト用データ(これらは配列データになります)を目で直接確認したいときによく使います。

matplotlibは、.jpg、.png形式などの画像ファイルを読み込む機能は持っていません。このため、これらの形式の画像ファイルを読み込むためには、 PillowOpenCV などの画像用ライブラリをimportして使います。以下では、Pillowライブラリを使った例で説明します。

画像ファイルを読み込んで画像を表示

一般的な画像ファイルを表示する方法です。

<パターン>

image = Image.open("画像ファイル名") #.jpg .png のファイルなどを読み込む
plt.imshow(image)
plt.show()

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image #Pillowライブラリをimportし、Image.open()を使えるようにします。
image = Image.open("test.jpg")
plt.imshow(image)
plt.show()

MPDS-02-09.png

画像ファイルで画像表示

配列データを基に画像表示

機械学習では、学習用データ等が画像ファイルではなく、 numpy配列のデータ として提供されている場合があります。numpy配列のデータであっても、imshowメソッドでは画像ファイルの場合と同様に下記の書き方で表示することができます。

<パターン>

plt.imshow(配列変数名)
plt.show()

下記は、MNISTの学習用データ(numpy配列)を画像で表示する例です。(”確認したい学習用データの番号を指定する”のところで番号を変えてみてください)

import tensorflow as tf
import matplotlib.pylab as plt
import 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 など(クラウドなので、ユーザーはインストール作業不要)で実行してください。

MPDS-02-10.png 学習用データ0番の場合

画像ファイルをnumpy配列のデータに変換して表示

これは Matplotlib の機能ではありませんが、機械学習のための画像処理の場面で出てくることがあるので、ここに掲載します。

機械学習においては、画像ファイル(.jpgや.png)のデータそのままでは処理できませんので、numpyの配列(ndarray)に変換する必要があります。このためには、画像ファイルをImage.open()で読み込んで、それをnp.array()に渡します。すると、形状shapeが( 行(高さ), 列(幅), 色(チャンネル))の三次元の配列ndarrayが得られます。この配列も、前項のようにimshowで表示することができます。

import numpy as np
import matplotlib.pyplot as plt
from 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 など(クラウドなので、ユーザーはインストール作業不要)で実行してください。

MPDS-02-11.png

numpy配列のデータで画像表示

参考資料: 「 pyplot.imshow – 画像表示」,tau, http://taustation.com/pyplot-imshow/