Matplotlib 入門：SVG 出力の基礎からはじめよう

## はじめに
データ可視化ライブラリとして広く使われているMatplotlibですが、SVG形式での出力は特に重要な機能の1つです。SVG（Scalable Vector Graphics）は拡大縮小しても画質が劣化しない、編集が容易、ファイルサイズが小さいなど、多くのメリットがあります。この記事では、Matplotlibを使ってSVG形式でグラフを出力する方法を、基礎から実践的な例まで順を追って解説していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/04f456d7-517c-0726-a9f6-429cc4c246cc.png)

## 環境準備
まずは必要なライブラリをインストールしましょう。

```bash
pip install matplotlib numpy
```

## 基本的なSVG出力
### シンプルな折れ線グラフの例
最も基本的な例として、単純な折れ線グラフをSVGとして保存する方法を見てみましょう。

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

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

# プロットの作成
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='sin(x)')
plt.title('Simple Line Plot')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()

# SVGとして保存
plt.savefig('simple_plot.svg', format='svg', bbox_inches='tight')
plt.close()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f1701800-4b1e-6195-28a4-ecee2a6f2265.png)

### SVG出力時の重要なパラメータ
`savefig()`メソッドには、SVG出力の品質に影響を与える重要なパラメータがいくつかあります：

- `dpi`: 解像度を指定（SVGの場合は主にサイズ計算に使用）
- `bbox_inches='tight'`: 余白を適切に調整
- `transparent=True`: 背景を透明に
- `format='svg'`: 出力形式をSVGに指定

```python
plt.savefig('high_quality.svg',
            format='svg',
            dpi=300,
            bbox_inches='tight',
            transparent=True)
```

## 実践的な使用例
### データ可視化の例：複数系列のプロット
実務でよく使用する、複数のデータ系列を含むグラフの例を見てみましょう。

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

# データの準備
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)

# プロットの作成
plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='sin(x)', color='blue')
plt.plot(x, y2, label='cos(x)', color='red')
plt.plot(x, y3, label='tan(x)', color='green')

# グラフの装飾
plt.title('Trigonometric Functions', fontsize=14)
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend(fontsize=10)

# 表示範囲の設定
plt.ylim(-2, 2)

# SVGとして保存
plt.savefig('trig_functions.svg',
            format='svg',
            dpi=300,
            bbox_inches='tight',
            transparent=True)
plt.close()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/af4022a6-1e70-7f9e-d658-bbb8c33062f7.png)

## SVG出力のベストプラクティス
1. **ファイルサイズの最適化**
   - 必要以上に高いDPIは避ける
   - 不要なデータポイントは間引く
   
2. **再現性の確保**
   - 乱数のシードを固定
   - スタイルを明示的に指定

3. **メモリ管理**
   - `plt.close()`で不要なFigureを解放
   - 大量のプロットを生成する場合はループ内でクリーンアップ

```python
# メモリ管理の例
for i in range(100):
    plt.figure(figsize=(8, 6))
    # ... プロットの作成 ...
    plt.savefig(f'plot_{i}.svg', format='svg')
    plt.close()  # メモリの解放
```

## よくある問題とその解決法
### 1. 日本語文字化け
SVGでの日本語表示には適切なフォント設定が必要です。

```python
import matplotlib.pyplot as plt
import matplotlib as mpl

# 日本語フォントの設定
plt.rcParams['font.family'] = 'IPAexGothic'  # または 'MS Gothic'
```

### 2. レイアウトの崩れ
テキストやラベルが重なる場合は、レイアウトを自動調整できます。

```python
plt.tight_layout()
# または
plt.savefig('plot.svg', format='svg', bbox_inches='tight')
```

### 3. ファイルサイズが大きい
データポイントを間引くか、圧縮を検討します。

```python
# データの間引き
x_reduced = x[::5]  # 5点ごとにサンプリング
y_reduced = y[::5]

# プロット時の線の単純化
plt.plot(x_reduced, y_reduced, linewidth=1.0)
```

## まとめ
MatplotlibでのSVG出力は、高品質なグラフィックスを作成する強力なツールです。この記事で紹介した基本的な使い方とベストプラクティスを押さえることで、実務で必要となる様々なケースに対応できるようになるでしょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4d603e1b-054b-c0b0-55a1-0fad88c528e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ea55d4ed-fcb5-b5c2-a41b-8b966dfcf4b2.png)

## 参考文献
- Matplotlib公式ドキュメント
- 「Python Data Science Handbook」
- 「Fundamentals of Data Visualization」

## 感想

この記事は、Matplotlibで作成したグラフをSVG形式で出力し、後から微調整を行う必要性を感じた経験から執筆しました。

実務でデータ可視化を行っていると、Matplotlibの基本的な機能だけでは細かい調整が難しいケースに遭遇することがあります。例えば：

- 特定の要素だけフォントを変更したい
- レイアウトを数ピクセル単位で調整したい
- 特殊な図形や注釈を追加したい

そういった場合に、SVG形式で出力しておけば、後からIllustratorやInkscapeなどのベクターグラフィックエディタで微調整できます。この記事が、同じような課題を持つ方々の参考になれば幸いです。

また、SVGの特性を活かすことで、Webサイトやプレゼンテーションでも高品質なグラフを活用できます。記事の内容が、データビジュアライゼーションの品質向上に少しでも貢献できれば嬉しく思います。