Matplotlibを利用してデータ可視化を行う際、描画の土台となる「Figure」と、個別のグラフ領域である「Axes」の関係を正しく把握することは、複雑なレイアウトを実現するための第一歩です。
描画の基本構造:FigureとAxesの関係
Matplotlibのグラフは、階層構造で管理されています。
- Figure: グラフを描くためのキャンバス全体を指します。
- Axes: 実際のグラフ(座標軸、プロット、ラベルなど)が含まれる領域です。一つのFigureの中に複数のAxesを配置できます。
基本的な描画フロー
オブジェクト指向インターフェースを用いた、最も拡張性の高い描画フローを解説します。ここでは、特定のウェブサービスの「日次レスポンスタイム」を可視化するシナリオを例に挙げます。
import matplotlib.pyplot as plt
# データの定義(完全オリジナル:ウェブサービスのレスポンスタイム)
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
response_times = [120, 135, 110, 150, 145, 130, 125] # 単位: ms
# 1. Figure(キャンバス)の生成
fig = plt.figure(figsize=(8, 5))
# 2. Axes(描画領域)の追加
# add_subplot(行数, 列数, インデックス)
ax_main = fig.add_subplot(1, 1, 1)
# 3. プロットの実行
ax_main.plot(days, response_times, marker='o', linestyle='-', color='teal', label='Response Time')
# 4. グラフの装飾
ax_main.set_title("Daily Server Response Time")
ax_main.set_xlabel("Day of Week")
ax_main.set_ylabel("Time (ms)")
ax_main.legend()
ax_main.grid(True, linestyle='--', alpha=0.7)
# 5. グラフの表示
plt.show()
実行結果 キャンバスが生成され、月曜日から日曜日までのレスポンスタイムの変化が折れ線グラフで表示されます。add_subplot(1, 1, 1)により、全体を1行1列に分割した1番目の領域(=全体)が描画範囲として指定されます。
複数のグラフを配置する(サブプロット)
add_subplotを活用することで、1つのFigure内に異なるデータを示す複数のグラフを整列させることが可能です。ここでは、ECサイトのパフォーマンス解析(売上、注文数、平均客単価、在庫数)を想定した2行2列のグリッド配置を紹介します。
import matplotlib.pyplot as plt
# データセットの生成(完全オリジナル:ECサイトのKPIデータ)
categories = ["Electronics", "Fashion", "Home", "Beauty"]
revenue = [500000, 320000, 450000, 210000]
orders = [120, 250, 180, 90]
avg_price = [4166, 1280, 2500, 2333]
stock = [45, 120, 85, 200]
# Figureの生成
fig = plt.figure(figsize=(12, 10))
# 1. 売上高(2行2列の1番目)
ax1 = fig.add_subplot(2, 2, 1)
ax1.bar(categories, revenue, color='royalblue')
ax1.set_title("Total Revenue")
ax1.set_ylabel("Amount (JPY)")
# 2. 注文数(2行2列の2番目)
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(categories, orders, marker='s', color='darkorange', linewidth=2)
ax2.set_title("Number of Orders")
ax2.set_ylabel("Count")
# 3. 平均客単価(2行2列の3番目)
ax3 = fig.add_subplot(2, 2, 3)
ax3.scatter(categories, avg_price, s=100, color='crimson')
ax3.set_title("Average Order Value")
ax3.set_ylabel("Price (JPY)")
# 4. 在庫状況(2行2列の4番目)
ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(categories, stock, marker='^', color='forestgreen', linestyle='--')
ax4.set_title("Inventory Levels")
ax4.set_ylabel("Units")
# レイアウトの自動調整
fig.tight_layout()
# 表示
plt.show()
実行結果 1つのウィンドウが4分割され、左上に売上の棒グラフ、右上に注文数の折れ線グラフ、左下に客単価の散布図、右下に在庫数の破線グラフが同時に表示されます。
効率的なグラフ管理のポイント
複数のグラフを扱う際は、fig.tight_layout()を呼び出すことで、軸ラベルやタイトルが隣り合うグラフと重なるのを自動的に防止できます。また、add_subplotの引数に(2, 3, i)を指定すれば、さらに多くのグラフ(2行3列など)を一つの画面に集約して比較・分析することが可能になります。
