🐈

Act 13. matplotlibを使ってみる

2024/11/11に公開

はじめに

Act 01. AIで外国為替を自動売買するまでの道のりをベースに学習を進めて行く。

最近は色々忙しくて学習が進んでいなかった。
久しぶりに学習できるから最高にうれしい…。今日からまた頑張るぞー!

前回は、機械学習の概念についての記事を書いていた。
今回から教師あり学習について進めて行こうと思っていたが、色々調べていたところpythonのmatplotlibというライブラリが使えるようになっていた方がよさそうだった。

ということで、今回は急遽matplotlibについての記事を書くことにする。

matplotlib

matplotlibとはPythonのデータを視覚化するライブラリらしい。
主にグラフやチャートを視覚化するために使用され、データの関係を理解しやすくすることが可能となる。

どのように可視化することが出来るのか説明していこうと思う。

折れ線グラフ

まずは折れ線グラフの書き方について。
これはものすごく簡単。

以下のコードをファイルに記述し実行すれば、ウィンドウが表示され、折れ線グラフが表示される。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
height = np.array([160, 165, 170, 175, 180, 185, 190, 195, 200])
weight = np.array([55, 60, 65, 70, 75, 80, 85, 90, 95])

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

plt.plot(height, weight)  # データのプロット
plt.title('Height vs Weight')  # 表のタイトル
plt.xlabel('Height(cm)')  # X軸のラベル
plt.ylabel('Weight(kg)')  # Y軸のラベル
plt.grid(True)  # グリッドを表示するか否か
plt.show()  # ウィンドウの表示

こんな感じ。

plt.plot()の引数で色々指定することも可能。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
height = np.array([160, 165, 170, 175, 180, 185, 190, 195, 200])
weight = np.array([55, 60, 65, 70, 75, 80, 85, 90, 95])

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

# 〇のマーカーを追加、ラインは破線、色を赤色に設定
plt.plot(height, weight, marker='o', linestyle='--', color='red')
plt.title('Height vs Weight')
plt.xlabel('Height(cm)')
plt.ylabel('Weight(kg)')
plt.grid(True)
plt.show()

こんな感じになる。

ちなみにheightweightはnumpyの配列にする必要はないが、numpyの配列を使用した方が処理が高速になるためそっちを使用するらしい。

棒グラフ

棒グラフの場合も折れ線グラフとほぼ同じ。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
height = np.array([160, 165, 170, 175, 180, 185, 190, 195, 200])
weight = np.array([55, 60, 65, 70, 75, 80, 85, 90, 95])

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

# plt.plot から plt.bar に変更
plt.bar(height, weight, color="green")
plt.title('Height vs Weight')  # 表のタイトル
plt.xlabel('Height(cm)')  # X軸のラベル
plt.ylabel('Weight(kg)')  # Y軸のラベル
plt.show()  # ウィンドウの表示

こんな感じで表示される。

散布図

次に散布図で、こちらもほぼ同じ書き方。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
height = np.array([160, 165, 170, 175, 180, 185, 190, 195, 200])
weight = np.array([55, 60, 65, 70, 75, 80, 85, 90, 95])

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

# plt.plot から plt.scatter に変更
plt.scatter(height, weight, color="blue")
plt.title('Height vs Weight')  # 表のタイトル
plt.xlabel('Height(cm)')  # X軸のラベル
plt.ylabel('Weight(kg)')  # Y軸のラベル
plt.show()  # ウィンドウの表示

こんな感じで表示される。

ヒストグラム

次にヒストグラムを書く。
55kg~95kgを5分割し、それぞれの範囲に何人存在しているかを表す場合は以下の通り。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
weight = np.array([55, 60, 65, 70, 75, 80, 85, 90, 95])

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

plt.hist(weight, bins=5, color="blue", edgecolor='black')
plt.title('Weight vs Count')  # 表のタイトル
plt.xlabel('Weight(kg)')  # X軸のラベル
plt.ylabel('Count')  # Y軸のラベル
plt.show()  # ウィンドウの表示

こんな感じで出力される。

円グラフ

円グラフは少し難しかった。
こんな感じで記述する。

Act13.py
import matplotlib.pyplot as plt
import numpy as np

# 身長と体重のデータ
height = np.array([160, 165, 170, 175, 180, 185, 190, 195, 200])

# 身長の範囲ごとに体重をグループ化
group_1 = np.sum((height >= 160) & (height < 170))
group_2 = np.sum((height >= 170) & (height < 180))
group_3 = np.sum((height >= 180) & (height < 190))
group_4 = np.sum((height >= 190) & (height <= 200))

sizes = [group_1, group_2, group_3, group_4]
labels = ['160-170cm', '170-180cm', '180-190cm', '190-200cm']

# 図のサイズを変更
plt.figure(figsize=(16, 12))  # 横16インチ、縦12インチ

plt.pie(sizes, labels=labels, autopct='%1.f%%', startangle=90, colors=['cyan', 'orange', 'lightgreen', 'lightblue'])
plt.title('Pie Chart')
plt.show()

こんな感じで出力される。

円グラフというと、0時スタートで割合が大きい順から時計回りに表示されていくイメージ。
画像の内容はその通りだが、sizes配列のgroup_2group_4の場所を入れ替えてみようと思う。
するとこんな感じで出力される。

何が言いたいかというと、自動でソートしてくれているわけではない。
なので、自分でソートしてからplt.pieに渡した方が良いことが分かった。

autopctの補足

表現 記述内容
小数点なしで整数部分のみのパーセンテージを表示 "%1.0f%%"
小数点以下1桁 %1.1f%%
小数点以下2桁 %1.2f%%
パーセント表示なし None

※小数点以下3桁や100桁も可能

さいごに

恐らくだが、円グラフや棒グラフは使う機会が少ないのでは?と思っている。
今回は折れ線グラフと散布図が書ければ一旦OKとしようと思う。

これで次回からはまた機械学習の勉強ができるぞー!

ではまた

Discussion