1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SVGAdvent Calendar 2024

Day 10

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

Posted at

はじめに

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

image.png

環境準備

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

pip install matplotlib numpy

基本的なSVG出力

シンプルな折れ線グラフの例

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

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

SVG出力時の重要なパラメータ

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

  • dpi: 解像度を指定(SVGの場合は主にサイズ計算に使用)
  • bbox_inches='tight': 余白を適切に調整
  • transparent=True: 背景を透明に
  • format='svg': 出力形式をSVGに指定
plt.savefig('high_quality.svg',
            format='svg',
            dpi=300,
            bbox_inches='tight',
            transparent=True)

実践的な使用例

データ可視化の例:複数系列のプロット

実務でよく使用する、複数のデータ系列を含むグラフの例を見てみましょう。

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

SVG出力のベストプラクティス

  1. ファイルサイズの最適化

    • 必要以上に高いDPIは避ける
    • 不要なデータポイントは間引く
  2. 再現性の確保

    • 乱数のシードを固定
    • スタイルを明示的に指定
  3. メモリ管理

    • plt.close()で不要なFigureを解放
    • 大量のプロットを生成する場合はループ内でクリーンアップ
# メモリ管理の例
for i in range(100):
    plt.figure(figsize=(8, 6))
    # ... プロットの作成 ...
    plt.savefig(f'plot_{i}.svg', format='svg')
    plt.close()  # メモリの解放

よくある問題とその解決法

1. 日本語文字化け

SVGでの日本語表示には適切なフォント設定が必要です。

import matplotlib.pyplot as plt
import matplotlib as mpl

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

2. レイアウトの崩れ

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

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

3. ファイルサイズが大きい

データポイントを間引くか、圧縮を検討します。

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

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

まとめ

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

image.png

image.png

参考文献

  • Matplotlib公式ドキュメント
  • 「Python Data Science Handbook」
  • 「Fundamentals of Data Visualization」

感想

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

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

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

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

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?