matplotlibとsebornの違いをまとめてみました

**Matplotlib** と **Seaborn** は、どちらもPythonでデータ可視化を行うためのライブラリですが、それぞれに特徴と用途があります。以下に両者の違いを詳細に説明します。


## 1. 基本的な概要

### Matplotlib
- Python標準のデータ可視化ライブラリで、基本的なプロットを作成するために使用されます。
- **高い柔軟性**を持つため、カスタマイズの幅が非常に広いですが、コードがやや複雑になることがあります。
- 低レベルのライブラリとして、可視化の基礎を構築することができます。

### Seaborn
- Matplotlibを基盤として構築された高レベルのデータ可視化ライブラリです。
- 見た目が美しい**テーマ設定**がデフォルトで適用され、複雑なプロットも簡単に作成できます。
- データフレーム（特にPandasデータフレーム）と統合して使うのが得意で、統計的な可視化に適しています。


## 2. 主な違い

| 特徴                 | Matplotlib                                             | Seaborn                                                   |
|----------------------|-------------------------------------------------------|----------------------------------------------------------|
| **目的**              | 汎用的な可視化                                         | 統計的可視化                                              |
| **使いやすさ**        | 自由度が高いが、やや煩雑                               | 簡単なコードで見栄えの良いグラフを作成可能               |
| **見た目の美しさ**    | デフォルトではシンプル                                  | 美しいテーマと配色がデフォルト                           |
| **データの扱い**      | 配列やリストに最適                                     | Pandasデータフレームとの相性が良い                       |
| **複雑なプロット**    | 手動で多くの設定が必要                                  | 関数が統合されており、簡単に作成可能                     |
| **テーマ設定**        | 手動で設定                                             | デフォルトで視覚的に優れたテーマを提供                   |
| **依存性**            | 独立して動作可能                                       | Matplotlibに依存                                         |


## 3. 詳細な違い

### a. 見た目の違い
#### Matplotlib:
  - デフォルトではシンプルで、古典的なプロットスタイル。
  - 見た目を調整するには手動で設定する必要があります。

  ```python
  import matplotlib.pyplot as plt

  x = [1, 2, 3, 4]
  y = [10, 20, 25, 30]

  plt.plot(x, y)
  plt.title("Matplotlib Plot")
  plt.show()
  ```
  ![スクリーンショット 2024-12-22 10.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/5177e126-c2d6-23c0-f296-9324bc7401b6.png)


#### Seaborn:
  - デフォルトで美しい配色やスタイルが適用されます。
  - 軽微なコードで視覚的に魅力的なグラフを作成可能。

  ```python
  import seaborn as sns
  import matplotlib.pyplot as plt

  sns.set_theme()  # デフォルトテーマを適用
  sns.lineplot(x=[1, 2, 3, 4], y=[10, 20, 25, 30])
  plt.title("Seaborn Plot")
  plt.show()
  ```
![スクリーンショット 2024-12-22 10.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/f9354ae3-1281-1c24-4a16-447d71b8daae.png)


### b. データフレームの扱い
#### Matplotlib:
  - データフレームを直接扱う機能は少なく、事前にデータをリストや配列に変換する必要があります。

#### Seaborn:
  - Pandasデータフレームとの統合が得意で、列名を直接指定してプロットできます。

  ```python
  import pandas as pd
  import seaborn as sns
  import matplotlib.pyplot as plt

  data = pd.DataFrame({
      "x": [1, 2, 3, 4],
      "y": [10, 20, 25, 30],
  })

  sns.lineplot(data=data, x="x", y="y")
  plt.show()
  ```
![スクリーンショット 2024-12-22 10.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/974cb826-0367-072b-34da-92df2c9adfeb.png)


### c. 統計的なプロット
#### Matplotlib:
  - 基本的なヒストグラムや散布図は作成可能ですが、回帰分析やカーネル密度推定などの統計的なプロットは自力で実装が必要。

#### Seaborn:
  - 統計的なプロットが標準で用意されており、短いコードで回帰線や分布図を作成可能。

  ```python
  # Seabornで回帰線付き散布図
  tips = sns.load_dataset("tips")
  sns.lmplot(data=tips, x="total_bill", y="tip", hue="sex")
  plt.show()
  ```
  ![スクリーンショット 2024-12-22 10.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/3bcc86c4-85f6-5bc4-6365-87c86d7df134.png)


### d. カスタマイズの柔軟性
#### Matplotlib:
  - 非常に細かい部分まで設定可能。
  - プロットのサイズ、色、軸の範囲、目盛りなどを細かく制御できます。

  ```python
  plt.figure(figsize=(8, 4))
  plt.plot([1, 2, 3], [4, 5, 6], color="red", linestyle="--", linewidth=2)
  plt.title("Customized Matplotlib Plot")
  plt.xlabel("X-axis")
  plt.ylabel("Y-axis")
  plt.show()
  ```
![スクリーンショット 2024-12-22 10.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/85db088b-23d3-953f-d935-8d8ea4252c68.png)


#### Seaborn:
  - 高度なカスタマイズは可能ですが、Matplotlibよりも制限があります。
  - ただし、簡単に美しいプロットを作成可能。


## 4. 併用のメリット

SeabornはMatplotlibに依存して動作しているため、**両者を組み合わせて使うことが可能**です。Seabornで簡単にプロットを作成した後、Matplotlibで詳細をカスタマイズするという流れが一般的です。

```python
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme()
sns.histplot([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], bins=4)

# Matplotlibでカスタマイズ
plt.title("Seaborn with Matplotlib Customization")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
```
![スクリーンショット 2024-12-22 10.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/2cad5001-c31d-db17-1310-d56b676299b5.png)


## 5. 選択基準

### Matplotlibを選ぶ場合:
  - 細かいカスタマイズが必要。
  - データフレームを使わず、配列やリストを直接扱う場合。
  - 可視化の自由度を重視する場合。

### Seabornを選ぶ場合:
  - 短いコードで視覚的に美しいプロットを作成したい。
  - Pandasデータフレームを直接扱いたい。
  - 統計的な分析や可視化が必要。


## 6. まとめ

| 項目                     | Matplotlib                               | Seaborn                                   |
|--------------------------|------------------------------------------|------------------------------------------|
| **柔軟性**               | 高い（細かいカスタマイズ可能）            | 中程度（基本的な部分は自動化される）      |
| **使いやすさ**           | やや複雑                                  | シンプルで直感的                         |
| **見た目**               | 手動で調整する必要がある                  | デフォルトで美しい                       |
| **統計的可視化**         | 自力で実装が必要                          | 簡単に作成可能                           |
| **データフレームとの統合**| 弱い                                      | 強い                                     |

どちらか一方を選ぶのではなく、**用途に応じて使い分ける**か、**併用**するのがベストなアプローチです。