2
2

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 11

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

Posted at

はじめに

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

image.png

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

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

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

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

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. 折れ線グラフ

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

シンプルな折れ線グラフ

# データの準備
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

複数系列の折れ線グラフ

# データの準備
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

2. 棒グラフ

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

シンプルな棒グラフ

# データの準備
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

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

# データの準備
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

3. 散布図

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

シンプルな散布図

# データの準備
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

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

# データの準備
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

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

# サンプルデータの作成
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

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

  1. 解像度とクオリティ
plt.savefig('filename.svg', format='svg', dpi=300, bbox_inches='tight')
  • format='svg': SVG形式での保存を指定
  • dpi=300: 高解像度で保存
  • bbox_inches='tight': 余白を適切に調整
  1. Google Driveへの保存
  • 保存先ディレクトリを事前に作成
  • パスは絶対パスで指定
  • ファイル名は分かりやすい命名規則で
  1. メモリ管理
  • グラフ作成後は plt.close() でメモリを解放
  • 大量のグラフを作成する場合は特に重要

まとめ

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

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

SVG形式でグラフを保存することで:

  • 画質を損なうことなく拡大可能
  • ウェブでの表示に最適
  • 後から編集可能

参考リンク

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?