Matplotlibを使った基本的なグラフ作成ガイド

## はじめに
Matplotlibを使えば折れ線グラフ、棒グラフ、散布図、ヒストグラム、パイチャートなど、さまざまな種類のグラフを簡単に作成できます。例えば、データの傾向やパターンを視覚化したり、作成したグラフを使って、分析結果を視覚的に分かりやすく伝えることができます。それではMatplotlibの使い方を書いていきます！


## 基本的な使い方
まず、Matplotlibには2つのグラフ作成方法があります。1つはオブジェクト指向の**Axesインターフェース**を使用する方法。2つ目は簡略化された**pyplotインターフェース**を使用する方法。
複雑なカスタマイズが必要な場合や、後から特定のグラフ要素を操作したい場合は、オブジェクト指向の**Axesインターフェース**が推奨されます。
シンプルなグラフやインタラクティブな作業には、**pyplotインターフェース**が便利です。

簡単な例をもとにそれぞれの比較をしてみます。
**・Axesインターフェース**
```python
import matplotlib.pyplot as plt

fig = plt.figure()  # Figureオブジェクトを作成
ax = fig.subplots()  # Axesオブジェクトを作成
ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])  # データをプロット
plt.show()  # グラフを表示
```

**・pyplotインターフェース**
```python
import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])  # データをプロット
plt.show()  # グラフを表示
```

どちらの方法でも下記のグラフが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/cda83135-d205-0221-e6b6-8a465ffb6db4.png)

それぞれ利点があり用途や目的に応じて使い分けることが必要になります。今回は**Axesインターフェース**を使用して解説をしていきます。


### ・折れ線グラフ
まず、Matplotlibを使用するためにはpyplotモジュールをインポートします。pyplotは、Matplotlibのプロット機能をMATLAB風のインターフェースで提供するモジュールです。
```python
import matplotlib.pyplot as plt
```

このインポートによって、pltという名前でpyplotの関数を使うことができるようになります。
基本的な折れ線グラフは下記のようになります。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# Axesを使ってプロットを描画
ax.plot(x, y)

# タイトルとラベルの追加
ax.set_title('Graph')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# グラフの表示
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/af4f7553-1a91-70fd-7211-0d1289604af6.png)

最初に、`fig = plt.figure()`でグラフを描画する領域全体であるFigureを作成します。

`ax = fig.subplots()`は、Figure内に個々のグラフを描画する領域であるAxesを作成します。ここで作成されたaxは、1つのグラフを描画するためのオブジェクトです。Axesは、X軸とY軸を持つグラフの「サブプロット」として機能します。

`ax.plot(x, y)`では、axオブジェクトを使ってデータをプロットしています。xとyのデータを線で結び、折れ線グラフを作成しています。このプロットはax（Axes）に描画されます。

`ax.set_title('Graph')` `ax.set_xlabel('X')` `ax.set_ylabel('Y')`では、グラフのタイトル、xとy軸の名前を決めています。

最後に、`plt.show()`を呼び出して、作成したグラフを表示します。このコマンドを実行すると、Figureとその中のAxes（プロット）がウィンドウに表示されます。

#### 複数のデータセット
次に、同じグラフに2つのデータを表示する方法を説明します。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
x = [1, 2, 3, 4, 5]
y1 = [1, 4, 9, 16, 25]
y2 = [2, 3, 5, 7, 11]

# 1つ目のデータセットのプロット
ax.plot(x, y1, label='blue', color='blue', linestyle='-', marker='o')

# 2つ目のデータセットのプロット
ax.plot(x, y2, label='green', color='green', linestyle='--', marker='s')

# タイトルとラベルの追加
ax.set_title('Graph')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# 凡例の追加
ax.legend()

# グラフの表示
plt.show()
```

下記のグラフが作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/6a49d140-6ce0-d428-e0c4-2777f11050d2.png)

複数のデータを同じAxesにプロットする場合、それぞれのデータセットを個別に`plot()関数`で描画します。それぞれのデータセットには、`color='blue'`  `linestyle='-'` `marker='o'`のように異なる線の色やスタイル、マーカーを指定することもできます。

また、`ax.legend()`を呼び出してプロットされた2つのデータセットの凡例を表示します。これにより、各データセットが何を表しているかがわかります。

### ・棒グラフ
棒グラフを作成するには、`ax.bar()関数`を使用します。
```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
categories = ['A', 'B', 'C', 'D', 'E']
values = [5, 7, 3, 8, 6]

# 棒グラフの作成
ax.bar(categories, values)

# タイトルとラベルの追加
ax.set_title('Graph')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# グラフの表示
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/9b14b41c-629d-a059-778e-a66b8dc9bac4.png)

categoriesがX軸に配置され、valuesがY軸の高さとしてプロットされます。各カテゴリに対して、対応する数値を高さとする棒が描かれます。

#### 積み上げ棒グラフ
各カテゴリごとにデータセットを積み上げた棒グラフも簡単に作成することができます。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
categories = ['A', 'B', 'C', 'D', 'E']
values1 = [5, 7, 3, 8, 6]
values2 = [2, 3, 5, 1, 4]

# 1つ目のデータセットの棒グラフ
ax.bar(categories, values1, label='Set 1')

# 2つ目のデータセットの棒グラフ（積み上げ）
ax.bar(categories, values2, bottom=values1, label='Set 2')

# タイトルとラベルの追加
ax.set_title('Chart')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# 凡例の追加
ax.legend()

# グラフの表示
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/b1ee861f-c336-0a2f-a401-2d4d9d05c93d.png)

`ax.bar(categories, values1, label='Set 1')`で 1つ目のデータセットをカテゴリごとにプロットして、
`ax.bar(categories, values2, bottom=values1, label='Set 2')`で2つ目のデータセットを1つ目のデータセットの上に積み上げてプロットします。`bottom=values1`で、積み上げる基準となる値を指定します。

### ・散布図
`ax.scatter()関数`を使用して散布図を作成していきます。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 3, 5, 7, 6, 8, 7, 9, 10, 12]

# 散布図の作成
ax.scatter(x, y)

# タイトルとラベルの追加
ax.set_title('Scatter Plot')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# グラフの表示
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/e211c2c3-ff1a-ce97-9eea-1b4a1beee4cf.png)

デフォルトでは、点の色は青、形は円になりますが、これらは後述するようにカスタマイズ可能です。

```python
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.subplots()

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 3, 5, 7, 6, 8, 7, 9, 10, 12]
sizes = [20, 50, 80, 120, 180, 220, 280, 300, 350, 400]  # 各ポイントのサイズ
colors = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # 各ポイントの色

ax.scatter(x, y, s=sizes, c=colors, cmap='viridis', alpha=0.7)
ax.set_title('Scatter Plot with Custom Sizes and Colors')
ax.set_xlabel('X')
ax.set_ylabel('Y')

plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/5fe69ced-2881-f96e-b282-49be86b7422d.png)

`s=sizes`で各データポイントのサイズを指定します。サイズはリストとして渡され、各ポイントに異なるサイズが割り当てられます。
`c=colors`は各データポイントの色を指定します。色もリストとして渡され、カラーマップ（cmap='viridis'）を使用して色を調整します。
`alpha=0.7`では各ポイントの透明度を指定します（0.0が完全に透明、1.0が不透明）。

### ・ヒストグラム
ヒストグラムを作成するには、`ax.hist()関数`を使用します。
ヒストグラムでは、データの範囲をいくつかの「ビン（bin）」と呼ばれる区間に分け、それぞれのビンに入るデータの数を棒で表現します。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

# ヒストグラムの作成
ax.hist(data, bins=5)

# タイトルとラベルの追加
ax.set_title('Histogram')
ax.set_xlabel('X')
ax.set_ylabel('Y')

# グラフの表示
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/0fdcf1ce-20a4-4aa1-8264-9bd7d9a232d3.png)

`data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]`のように、数字の要素数でy軸のメモリが決まります。

`ax.hist()`を使用してヒストグラムを作成します。dataの各要素がどのように分布しているかをプロットします。bins=5は、データの範囲を5つのビン（区間）に分けることを指定しています。各ビンには、その範囲に含まれるデータの数がY軸に表示されます。

### ・円グラフ
円グラフを作成するには、ax.pie()関数を使用します。この関数は、データの割合に応じて円を分割し、各スライスを描画します。

```python
import matplotlib.pyplot as plt

# FigureとAxesの作成
fig = plt.figure()
ax = fig.subplots()

# データの準備
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]

# パイチャートの作成
ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)

# タイトルの追加
ax.set_title('Pie Chart')

# グラフの表示
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/83e7e186-e1a2-1943-f9f8-99e396b49e5d.png)

`labels = ['A', 'B', 'C', 'D']`は各スライスのラベルで、`sizes = [15, 30, 45, 10]`は各カテゴリの割合を示す数値（例えば、頻度や割合）です。

`ax.pie()`を使用して円グラフを作成します。各sizesの値に基づいてスライスの大きさを決定し、labelsで指定された名前をスライスに表示します。

`autopct='%1.1f%%'`では各スライスの割合をパーセンテージ形式で表示します。'%1.1f%%'は小数点以下1桁まで表示するフォーマット指定子です。

`startangle=90`は円グラフの最初のスライスが始まる角度を指定します。90度にすると、12時の位置から時計回りにスライスが描かれます。

#### スライスを強調表示

特定のスライスを強調するために、そのスライスを円から外側に少しずらすことができます。これは`explode`パラメータを使用して行います。

```python
explode = (0, 0.1, 0, 0)  # 2番目のスライスを強調表示
ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, explode=explode)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/a02288c5-cc34-f9b2-f521-725e7771da60.png)


`explode = (0, 0.1, 0, 0)`とすると、2番目のスライス（B）が10%外側にずれます。

#### ドーナッツチャート
`wedgeprops`を設定して、中心に穴を開けることもできます。
```python
ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, wedgeprops={'width': 0.3})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055779/237a93c5-ce36-f9a7-ffa2-494872369186.png)


## まとめ
Matplotlibを使えば、折れ線グラフ、棒グラフ、散布図、ヒストグラム、円グラフなど、幅広いグラフを簡単に作成でき、データの視覚化を通じて洞察を深めることができます。特に、オブジェクト指向のAxesインターフェースを使用することで、複雑なカスタマイズも柔軟に行えるため、データ分析や報告書作成において非常に有効です。グラフの基本的な作成方法を押さえつつ、さまざまなオプションやカスタマイズを試して、データを効果的に伝えるスキルを磨いていきましょう。