Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う

힘센캥거루
2023년 11월 13일(수정됨)
7
python

Pandasに続く記事です。前回の記事を参考にしてください。

Pythonでデータビジュアライゼーションをしようとしたとき、最も入門が難しかったライブラリがMatplotlibでした。

資料はたくさんあるのですが、具体的にどのように学んでいけばよいか感覚がつかめませんでした。

この記事ではMatplotlibの本当に基本的な使用法から始めて、詳細な軸設定までを順次扱ってみようと思います。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-1

1. Matplotlibの呼び出しと日本語設定

下のグラフは前回の記事で使用した、地域別の熱波日数を可視化したものです。

日本語がすべて□の形で表示されることがわかります。

これはMatplotlibが日本語フォントをサポートしていないためです。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-2

日本語フォントを使用したい場合は、以下のコードをそのままコピー&ペーストしてください。

フォントは筆者が最も好きなフォントである「MS ゴシック」を設定しました。

# モジュール呼び出しと日本語フォント設定
import matplotlib.pyplot as plt
import matplotlib

# MacOSでフォント設定
# matplotlib.rcParams["font.family"] = "AppleGothic"

# Windowsでフォント設定
matplotlib.rcParams["font.family"] = "Malgun Gothic"

# フォントサイズ設定
matplotlib.rcParams["font.size"] = 13

# マイナス表示の問題解決
plt.rcParams['axes.unicode_minus'] = False

前回の記事でも言いましたが、こういった内容は全て暗記するものではありません。

「このような解決方法がある」という程度を知っていれば十分です。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-3

このコードを実行した後、グラフを描いてみると以下のように日本語がきちんと表示されるのが分かります。

同様のグラフを次回描いてみましょう。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-4

2. 直線グラフ(plot)を描く

グラフの中で最も描きやすいのが直線グラフです。

直線グラフが描ければ他のグラフも簡単に描けます。

グラフを装飾するよりも、まずグラフを一度描いてみることに集中して記事を進めていこうと思います。

1) グラフを描く

まずy=x 形式の一次関数を描いてみましょう。x 値y 値を以下のようにリストに入れました。

x = [1,2,3,4,5]
y = [1,2,3,4,5]

そしてこれをそのまま下記のようにパラメーターとして渡します。

plt.plot(x, y)

これで以下のような出力が表示されるのがわかります。

本来はplt.show()を利用してグラフを表示する必要がありますが、Jupyterノートブックではその手順なしにすぐに結果を見ることができます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-5

このようにx 値と y 値を使用してグラフを描いてみました。

plt.plot() 内のパラメーターとして x, y 値をリスト形式で渡すとグラフがそのまま描かれます。

データフレームも支援しています。

しかしこれで終わるのはもったいないので、いくつかの機能を一度学んでみましょう。

2) 凡例の設定

グラフに値をもう一つ追加してみましょう。

先ほど入力したx, y 値をドラッグした後、Alt + Shift + ↓(矢印)を押すと値がそのままコピーされます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-6

これを一つずつ変更して x1, y1 と指定することもできますが、それはかっこよくないです。

下記の方法で簡単に入力してみましょう。

x1 = x.copy()
x1.reverse()
y1 = y.copy()
plt.plot(x1,y1)
Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-7

こうしてグラフを描くと、2つの直線が異なる色で表示されていることがわかります。

これをもっと明確にしたい場合は凡例を設定することができます。

それぞれのplt.plot() 内に label というパラメータを追加します。

x = [1,2,3,4,5]
y = [1,2,3,4,5]
x1 = x.copy()
x1.reverse()
y1 = y.copy()
plt.plot(x,y,label="A")
plt.plot(x1,y1,label="B")
plt.legend()

以下のように右隣に凡例が表示されていることを確認できます。

凡例の位置も任意で変更可能ですが、それは他の機能を学んだ後に試してみましょう。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-8

3) タイトル設定

タイトル設定は簡単にplt.title() 内に str 形式のパラメータを渡せばいいです。

plt.title("私の素敵なグラフ")

これを入力するとグラフの上部にタイトルが表示されます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-9

fontsizeというパラメータを与えると文字の大きさも変更できます。

plt.title("私の素敵なグラフ", fontsize=25)

下記のようにグラフのタイトルのサイズが大きくなったことを確認できます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-10

4) 軸の名前設定

今回は x 軸と y 軸が何を示しているのかを表現してみます。以下のように比較的簡単なコードで入力可能です。

plt.xlabel("x軸の名前設定", fontsize=25)
plt.ylabel("y軸の名前設定", fontsize=25)

xlabel, ylabel も title と同様に fontsize をパラメータとして受け取ることができます。

入力しないとデフォルトのフォントサイズで入力されます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-11

5) 軸間隔設定

軸間隔 0.5 が不便です。軸間隔を変更してみましょう。

plt.xticks(x)
plt.yticks(y)

xticksまたは yticks 内にリスト形式で希望の値を入れてください。

今は 1~5 の値を使用しましたが、これより少ない値も可能です。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-12

また軸の値自体を変更することもできます。

今回はx 軸の間隔を [1,3,5] に設定し、これを文字列である ["a", "b", "c"] に変更してみます。

# plt.xticks("軸値の間隔と範囲", ["変更する値"])
# y値変更は yticks で、xticks と使用法は同じです。

plt.xticks([1,3,5], ["a", "b", "c"])
plt.yticks(y)

該当コードを入力すると、以下のように x 軸の値が変更されたことがわかります。

xticks, yticks の最初のパラメータは変更する軸の間隔を、2番目のパラメータは変更したい値を入力します。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-13

もう一歩進んでy軸も変更してみましょう。

plt.xticks([1,3,5], ["a", "b", "c"])
plt.yticks(y,["アイアン", "ブロンズ", "シルバー", "ゴールド", "プラチナ"])

以下のように値が正しく変更されたことがわかります。

注意点は、軸の間隔と変更する値の個数は同じでなければならないことです。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-14

6) 線のスタイル指定

線のスタイルも変更できます。

plt.plot() 内に color, marker, linestyle などのパラメータを入力します。

plt.plot(x,y,
         label="A",
         marker = "^", # 点を描く
         color="darkred", # 線色
         linestyle=":" # ラインスタイル
         )

2つのグラフのうち1つだけを変更すると、以下のようにグラフが表示されるのがわかります。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-15

上記の方法で入力するのもわかりやすいですが、パラメータを全て覚えるのは難しいです。

そんな場合は、以下の方法で簡単に入力することもできます。

# 線スタイル変更 1
plt.plot(x,y,
         label="A",
         marker = "^",
         color="darkred",
         linestyle=":")
         
# 線スタイル変更 2 
plt.plot(x1,y1,"go:",label="B")

x 値と y 値の後に str の形式で色、マーカー、線スタイルを全て付けて入力します。

この方法がより簡単に表現できます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-16

以下はMatplotlibがサポートする色、マーカー、ラインスタイルの種類です。

好きなものを選んでください。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-17Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-18

3. さまざまなグラフを描いてみる

今回は plot 以外の他のグラフを描いてみましょう。

パラメータだけを少し変えるだけで、x 値と y 値を入力するのはすべて同じです。

1) 棒グラフ(bar)

まず1つのグラフでx, y 値と label を除くすべてのパラメータを削除します。

そしてplt.plotをplt.barに変更します。

plt.bar(x,y,label="A")

とても単純に前のplotだけを変えると、グラフを描いてくれます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-19

グラフが互いに濃すぎて不便なので、barに透過度としてalphaパラメータを追加しましょう。

plt.bar(x,y,label="A",alpha=0.4)

これで既存の値がバーグラフに変更されたことがわかります。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-20

plotと同様の方法で色や幅の指定も可能です。

plt.bar(x,y,label="A",alpha=0.4,color="red")
plt.bar(x,y,label="C, width=0.4",alpha=0.4,width=0.4,color="yellow")
Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-21

2) 水平棒グラフ(barh)

今回は水平グラフを描いてみます。

先にplt.bar の後に h だけを追加して plt.barh にすれば良いです。

plt.barh(x,y,label="A", alpha=0.4, color="red")

下記のようにグラフが変更されていることを確認できます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-22

B グラフも水平グラフに変更してalpha 値を与えてみました。

そしてx, y 値を元の値に戻しました。

plt.barh(x,y,label="A",alpha=0.4,color="red")
plt.barh(x1,y1,label="B",alpha=0.4,color="green")
Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-23

重なるのが気に入らない場合は、グラフの1つにy値にマイナスをかけて左右に展開して見ることもできます。

y1 = y.copy()
y1 = [-i for i in y1]
plt.barh(x,y,label="A",alpha=0.4,color="red")
plt.barh(x1,y1,label="B",alpha=0.4,color="green")

下記のように、出生率を見る際に多く使われたようなグラフが出ます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-24

NumPy を知っていれば、以下のように NumPy.array を使って比較的簡単に値を反転させることもできます。

結果は上記と同じです。

y1 = y.copy()
y1 = np.array(y1)
plt.barh(x,y,label="A",alpha=0.4,color="red")
plt.barh(x1,-y1,label="B",alpha=0.4,color="green")

3) 散布図(scatter)

今回は散布図を描いてみます。

前の barh を消してscatterと入力すれば問題ありません。

B グラフの y 値も元に戻しました。

plt.scatter(x,y,label="A",alpha=0.4,color="red")
plt.barh(x1,y1,label="B",alpha=0.4,color="green")

散布図は値の位置を単純に点で示します。

値の分布や相関関係を確認したいときに利用すると良いです。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-25

4) ヒストグラム(hist)

ヒストグラムは値の分布を示します。

設定した 1~5 の間の値はすべて同じなので、ヒストグラムを描くと直線しか出てきません。

random という組み込み関数を使ってランダムな値を追加してみましょう。

念のためにNumPy の例示も入れておきました。

# 組み込み関数を使う場合
import random
y2 = [random.randint(0,101) for i in range(100)]
plt.hist(y2, alpha=0.4)

# numpy を使う場合
import numpy as np
y3 = np.random.randint(0, 101, 100) # (開始数、終了数、長さ)の順に入力
plt.hist(y3, alpha=0.4)

以下のように、1つの範囲にどれだけ多くの値が入っているかを示します。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-26

推測したい値の範囲とグラフの幅も指定できます。

値の範囲であるbinsを10に、グラフの幅を15に設定してみました。

import random
y2 = [random.randint(0,101) for i in range(100)]
plt.hist(y2,label="a",alpha=0.4)

import numpy as np
y3 = np.random.randint(0,101, 100)
plt.hist(y3,label="b, bins=5",alpha=0.4,bins=5,width=15)

plt.legend()
Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-27

5) ボックスプロット(boxplot)

今回はボックスプロットです。

一見馴染みがないように見えますが、最上部から最大値、上位25%、中央値、下位25%、最小値を示しています。

上のy2, y3 を1つのボックスプロットに入力してみました。

import random
y2 = [random.randint(0,101) for i in range(100)]

import numpy as np
y3 = np.random.randint(0,101, 100)

plt.boxplot([y2,y3], labels=["y2","y3"])

希望する値をリスト形式で入力すると一度に表現してくれます。

また、labels というパラメータをリスト形式で入力することで値が何なのかを表現できます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-28

カラーサポートもありますが、それぞれのオブジェクトを扱う必要があるのでこちらは割愛します。

もっと詳しく知りたい場合は簡単に調べることができます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-29

6) バイオリンプロット(violinplot)

バイオリンプロットはボックスプロットとは少し異なり、ループの形で値の分布を示します。

import random
y2 = [random.randint(0,101) for i in range(100)]

import numpy as np
y3 = np.random.randint(0,101, 100)

plt.violinplot([y2,y3])

バイオリンプロットはボックスプロットよりも値の分布をわずかに詳しく知ることができます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-30

ここで中央値上位、下位25%ラインを見たい場合、以下のコードを追加できます。

plt.violinplot([y2,y3], showmeans=True, quantiles=[[0.25,0.75],[0.25,0.75]])

showmeans は中央値を、quantilesはそれぞれで表現する四分位を小数で入力します。

以下のようにボックスプロットよりも少し詳しく、見やすく表現されます。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-31

グラフを見て x 軸が少し気に入らなかったので、x 軸を以下のように修正しました。

plt.violinplot([y2,y3], showmeans=True, quantiles=[[0.25,0.75],[0.25,0.75]])
plt.xticks([1,2], ["y2","y3"])

少し落ち着いた感じがします。

Pythonデータビジュアライゼーション入門4 - Matplotlibを扱う-32

4. 記事を終えて

今回の記事ではMatplotlibを利用したビジュアライゼーションを本当に味わう程度でした。

本当に簡単に考えると、x 値と y 値を与えるだけでグラフを描くことができます。

その後に軸設定や回転などは付随的なものです。

最初から全てを学ぼうとする態度は学習の進行を妨げるだけです。

一つ一つ作って、試しながら徐々に学ぶことを願っています。

次回の記事ではPandasで呼び出したデータをMatplotlibでビジュアライゼーションしてみましょう。

댓글을 불러오는 중...