Matplotlib で作る基本グラフ：Google Colabで折れ線・棒・散布図をSVGで美しく表現

## はじめに

データ可視化は、データ分析において重要な役割を果たします。本記事では、Google Colab環境でMatplotlibを使用してSVGグラフを作成する方法を、実践的なコード例とともに解説します。SVG形式は、拡大してもぼやけない高品質なベクターグラフィックスを提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9fdd5e12-fce0-5836-7963-1bfaa10c451f.png)

### 必要なライブラリのインポート

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

# Google Colab用のインライン表示設定
%matplotlib inline
```

### Google DriveのマウントとSVG保存用のディレクトリ設定

```python
from google.colab import drive
drive.mount('/content/drive')

# SVG保存用のディレクトリパス
SAVE_DIR = '/content/drive/My Drive/matplotlib_svg/'

# ディレクトリが存在しない場合は作成
import os
os.makedirs(SAVE_DIR, exist_ok=True)
```

## 1. 折れ線グラフ

折れ線グラフは、時系列データの表現に適しています。

### シンプルな折れ線グラフ

```python
# データの準備
x = np.linspace(0, 10, 100)
y = np.sin(x)

# グラフの作成
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')

# グラフの装飾
plt.title('Simple Line Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.legend()
plt.grid(True)

# SVGとして保存
plt.savefig(f'{SAVE_DIR}simple_line.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a156f6c2-f211-9c8a-d201-4fbc31528b96.png)


### 複数系列の折れ線グラフ

```python
# データの準備
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# グラフの作成
plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')

# グラフの装飾
plt.title('Multiple Line Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.legend()
plt.grid(True)

# SVGとして保存
plt.savefig(f'{SAVE_DIR}multiple_line.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7fbb4495-e335-1e2d-d647-34e9ef11d36e.png)


## 2. 棒グラフ

棒グラフは、カテゴリカルデータの比較に適しています。

### シンプルな棒グラフ

```python
# データの準備
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 43]

# グラフの作成
plt.figure(figsize=(10, 6))
bars = plt.bar(categories, values)

# 棒の上に値を表示
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height,
             f'{height:,}',
             ha='center', va='bottom')

# グラフの装飾
plt.title('Simple Bar Plot')
plt.xlabel('Categories')
plt.ylabel('Values')

# SVGとして保存
plt.savefig(f'{SAVE_DIR}simple_bar.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/5bd32b6e-9a4c-8a32-375b-8a355e44cafd.png)


### グループ化された棒グラフ

```python
# データの準備
labels = ['Group A', 'Group B', 'Group C', 'Group D']
men_means = [20, 34, 30, 35]
women_means = [25, 32, 34, 20]

x = np.arange(len(labels))
width = 0.35

# グラフの作成
plt.figure(figsize=(10, 6))
plt.bar(x - width/2, men_means, width, label='Men')
plt.bar(x + width/2, women_means, width, label='Women')

# グラフの装飾
plt.title('Grouped Bar Plot')
plt.xlabel('Groups')
plt.ylabel('Values')
plt.xticks(x, labels)
plt.legend()

# SVGとして保存
plt.savefig(f'{SAVE_DIR}grouped_bar.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/46b3789c-62eb-5a85-5f17-4a9e3ec6069a.png)


## 3. 散布図

散布図は、2つの変数間の関係を視覚化するのに適しています。

### シンプルな散布図

```python
# データの準備
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = 2 * x + np.random.normal(0, 0.5, 100)

# グラフの作成
plt.figure(figsize=(10, 6))
plt.scatter(x, y)

# グラフの装飾
plt.title('Simple Scatter Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.grid(True)

# SVGとして保存
plt.savefig(f'{SAVE_DIR}scatter.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b3586793-189c-b465-cc72-3e7d7a4a21c3.png)


### カラーマップを使用した散布図

```python
# データの準備
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
colors = np.random.rand(100)

# グラフの作成
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x, y, c=colors, cmap='viridis')
plt.colorbar(scatter)

# グラフの装飾
plt.title('Scatter Plot with Colormap')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.grid(True)

# SVGとして保存
plt.savefig(f'{SAVE_DIR}scatter_colormap.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/52b08946-a94f-fd03-ff3d-b5f8f0727a73.png)


## 実践例：売上データの可視化

```python
# サンプルデータの作成
dates = pd.date_range('2023-01-01', '2023-12-31', freq='M')
sales = np.random.normal(1000, 100, len(dates))
costs = sales * 0.7 + np.random.normal(0, 50, len(dates))
profit = sales - costs

# データフレームの作成
df = pd.DataFrame({
    'Date': dates,
    'Sales': sales,
    'Costs': costs,
    'Profit': profit
})

# 複合グラフの作成
plt.figure(figsize=(12, 6))
plt.plot(df['Date'], df['Sales'], marker='o', label='Sales')
plt.plot(df['Date'], df['Costs'], marker='s', label='Costs')
plt.bar(df['Date'], df['Profit'], alpha=0.3, label='Profit')

plt.title('Sales, Costs, and Profit Overview')
plt.xlabel('Date')
plt.ylabel('Amount')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)

# グラフの表示（余白を自動調整）
plt.tight_layout()

# SVGとして保存
plt.savefig(f'{SAVE_DIR}sales_overview.svg', format='svg', bbox_inches='tight', dpi=300)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c8840931-e875-5944-43fc-8aaf8faf6f12.png)

## SVGファイル保存のポイント

1. **解像度とクオリティ**
```python
plt.savefig('filename.svg', format='svg', dpi=300, bbox_inches='tight')
```
- `format='svg'`: SVG形式での保存を指定
- `dpi=300`: 高解像度で保存
- `bbox_inches='tight'`: 余白を適切に調整

2. **Google Driveへの保存**
- 保存先ディレクトリを事前に作成
- パスは絶対パスで指定
- ファイル名は分かりやすい命名規則で

3. **メモリ管理**
- グラフ作成後は `plt.close()` でメモリを解放
- 大量のグラフを作成する場合は特に重要

## まとめ

本記事では以下の内容を解説しました：

- 基本的なグラフタイプ（折れ線・棒・散布図）の作成方法
- SVGファイルとしての保存方法
- Google Colab環境での効率的なグラフ作成

SVG形式でグラフを保存することで：
- 画質を損なうことなく拡大可能
- ウェブでの表示に最適
- 後から編集可能

## 参考リンク

- [Google Colab](https://colab.research.google.com/)
- [Matplotlib 公式ドキュメント](https://matplotlib.org/)
- [Matplotlib SVG backend](https://matplotlib.org/stable/api/backend_svg_api.html)