【Python】Matplotlib ~ グラフ描画ライブラリ ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/03/08/113356

を書く際に、ちょこちょこでてきた Matplotlib について
取り上げる

■ グラフの種類

1)折れ線
2)ヒストグラム
3)棒グラフ
4)散布図
5)円グラフ
6)箱ひげ図
7)ヒートマップ
etc...

■ 動画

* 以下の動画で学べる

https://www.youtube.com/watch?v=69Rd7GjgiMs
コード
https://github.com/TatsuhiroAbe/libraries_tutorial/blob/master/04/04_matplotlib_tutorial.ipynb

■ 環境設定

以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2018/02/17/102927

■ サンプル

例0:Hello world - シグモイド関数 

import numpy as np
import matplotlib.pyplot as plt

# シグモイド関数
def sigmoid_function(x, a=1):
  return 1.0 / (1.0 + np.exp(-a*x))

# 第一引数:最初の値, 第二引数:最後の値
x = np.linspace(-10.0, 10.0)

# プロット(折れ線グラフ)
plt.plot(x, sigmoid_function(x), label="a=1")
plt.plot(x, sigmoid_function(x, 4), linestyle=":", label="a=4")
plt.plot(x, sigmoid_function(x, 0.5), linestyle="--", label="a=0.5")

# 表示
plt.show()

例1:折れ線 - plot()

import numpy as np
import matplotlib.pyplot as plt

# Step1:データ用意
# numpy.linspace()
# 第一引数:最初の値, 第二引数:最後の値, 第三引数:要素数
x = np.linspace(0, 1, 5)
# numpy.random.randn()
# 標準正規分布を5個生成
y = x + 0.2 * np.random.randn(5)

# Step2:プロット(折れ線グラフ)
plt.plot(x, y, label="Hello world")

# Step3:グラフ表示
# 凡例
plt.legend()
# 表示
plt.show()

複数グラフを同一領域に表示するには... (一部抜粋)

# 標準正規分布を5個生成
y1 = x + 0.2 * np.random.randn(5)
y2 = x + 0.3 * np.random.randn(5)

# Step2:プロット(折れ線グラフ)
plt.plot(x, y1, color='red', linewidth=2.0, linestyle='solid')
plt.plot(x, y2, color='blue', linewidth=2.0, linestyle='dashed')

# 凡例
plt.legend(['Hello - 1', 'Hello - 2'])

例2:ヒストグラム - hist()

以下のサイトのサンプルで勉強。

https://www.youtube.com/watch?v=N9fDIAflCMY

import numpy as np
import matplotlib.pyplot as plt

data_number = 500

grey_height = 28 + 4 * np.random.randn(data_number)
lab_height = 24 + 4 * np.random.randn(data_number)

plt.hist([grey_height, lab_height], stacked=True, color=['r', 'b'])
plt.show()

例3:棒グラフ - bar()

 「Kaggle(カグル)」の
「Titanic: Machine Learning from Disaster」を使用する

https://dk521123.hatenablog.com/entry/2020/04/04/021413
Pythonコード

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

train_df = pd.read_csv('train.csv', encoding='UTF-8')

# グラフインスタンスを生成(グラフの大きさを指定)
figure = plt.figure(figsize=(12, 4))
# 1行2列のグラフのうち1番目に、グラフ描画領域を指定
axis1 = figure.add_subplot(121)

pclassplot = train_df['Survived'].groupby(train_df['Pclass']).mean()
# 棒グラフ
axis1.bar(x=pclassplot.index, height=pclassplot.values)
# X軸のラベル表示
axis1.set_xlabel('Pclass', fontsize=15)
# Y軸のラベル表示
axis1.set_ylabel('Survival rate', fontsize=15)
axis1.set_xticks(pclassplot.index)
axis1.set_yticks(np.arange(0, 1.1, 0.1))
# グラフのタイトル表示
axis1.set_title('Pclass and Survival rate')

# 1行2列のグラフのうち2番目に、グラフ描画領域を指定
axis2 = figure.add_subplot(122)
sexplot = train_df['Survived'].groupby(train_df['Sex']).mean()
axis2.bar(x=sexplot.index, height=sexplot.values)
axis2.set_xlabel('Sex', fontsize=15)
axis2.set_ylabel('Survival rate', fontsize=15)
axis2.set_xticks(sexplot.index)
axis2.set_yticks(np.arange(0, 1.1, 0.1))
axis2.set_title('Sex and Survival rate')

plt.show()

例4:散布図 - scatter()

https://pythondatascience.plavox.info/matplotlib/%E6%95%A3%E5%B8%83%E5%9B%B3

import numpy as np
import matplotlib.pyplot as plt

# Step1:データ用意
# 乱数を 100 件生成
x = np.random.rand(100)
y = np.random.rand(100)

# Step2:散布図を表示
plt.scatter(
  x, y, s=100, c="red", cmap='Blues', marker="x")

# Step3:グラフ表示
# カラーバーを表示
plt.colorbar()
plt.show()

例5:円グラフ - pie()

https://pythondatascience.plavox.info/matplotlib/%E5%86%86%E3%82%B0%E3%83%A9%E3%83%95

import numpy as np
import matplotlib.pyplot as plt

# Step1:データ用意
dataset = np.array([10, 20, 30, 40])
dataset_labels = ["Mike", "Tom", "Sam", "Kevin"]

# Step2:円グラフ
plt.figure(figsize=(10, 10))
plt.pie(dataset, labels=dataset_labels, autopct='%.1f%%',
  textprops={'fontsize': 9},
  wedgeprops={'linewidth': 2, 'edgecolor': "white"})

# Step3:グラフ表示
plt.show()

■ グラフに関するあれこれ

1)画像ファイルとして保存

# 画像ファイルとして保存
plt.savefig('sample_output.png')

2)見た目を変える

可視化ライブラリ「seaborn」を使用する

https://www.sejuku.net/blog/61017
https://qiita.com/hik0107/items/3dc541158fceb3156ee0
https://qiita.com/saira/items/31328921ad0a4c203db4
インストール

pip install seaborn
conda install seaborn

サンプル

import seaborn as sns

sns.set_style('darkgrid')

3)注釈/矢印 でグラフを説明するには

plt.annotate() を使う

参考文献
https://python.atelierkobato.com/annotate/
https://qiita.com/damyarou/items/839325f73c3118f2be3b

関連記事

TensorFlow ~ 環境構築 / Windows 編 ~
https://dk521123.hatenablog.com/entry/2018/02/17/102927
scikit-learn ~ 機械学習用ライブラリ・基本編 ~
https://dk521123.hatenablog.com/entry/2020/03/08/113356
NumPy ~ 数値計算ライブラリ ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532
Pandas ~ データ解析支援ライブラリ ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957