組み込み開発のためのPython · レッスン 136 / 238
Matplotlib Subplot:複数の図を並べる
subplotsは一つのFigureに複数のAxesを配置します。比較する系列には共通の単位や軸範囲を使い、異なる尺度を同じ軸に重ねて誤読させないようにします。
subplotsは一つのFigureに複数のAxesを配置します。比較する系列には共通の単位や軸範囲を使い、異なる尺度を同じ軸に重ねて誤読させないようにします。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。
subplotとFigureの役割
複数のグラフを一つの画像で比較するとき、Matplotlibのsubplotやsubplotsで複数のAxesを配置できます。Figureは出力全体を表し、各Axesは独立したデータ領域です。別々の画像を並べるより視線を移しやすくなりますが、情報を詰め込みすぎると文字や目盛りが小さくなります。並べる目的と比較する対象を先に決め、同じ期間、単位、尺度で比較できる系列を選んでください。Axesごとに異なる単位や範囲を使う場合、その差が明確に分かるタイトルやラベルを付けます。
subplotsで行列を作る
plt.subplotsは行数と列数を指定してFigureとAxesを作ります。例えば二行二列なら四つの描画領域ができます。戻り値のAxesは指定した行列に応じて配列になることが多いですが、一つだけ作ったときやsqueeze設定で返り値の形が変わります。常に同じ形で扱いたい場合はsqueeze=Falseを使う方法があり、返り値を使うコードを簡潔にできます。作成後にfigsizeを設定し、描画領域が出力用途に十分な大きさか確認してください。配列のshapeと各Axesの位置を印字または図上で確認し、インデックスの取り違えを防ぎます。
Axes配列を安全に扱う
複数Axesをループで設定すると、共通のラベルやグリッドをまとめて適用できます。axes.flatで平坦化する方法は、行列の列数が変わっても各領域を同じ処理で走査しやすくします。行または列の一部だけへ設定する場合は、Axes配列の次元と軸方向を確認してください。変数名axesとaxを使い分け、単一オブジェクトと配列を混同しないようにします。プロット関数へ渡すデータのリスト数とAxes数が異なる場合、過不足を例外にするか、空の領域の扱いを明示します。四つの図を意図した位置へ描いたか、ラベルや系列名も含めて検査しましょう。
共通軸で比較する
sharexやshareyを指定すると、複数Axesで同じ軸範囲や目盛りを共有できます。同じ単位のデータを並べる場合は、値の差を直接比較しやすくなります。各図が個別に自動範囲を持つ状態では、同じ変動量でも見た目の高さが異なる可能性があります。共有軸は各Axesの設定を連動させるため、片方だけ範囲を変えたい場合には向きません。下段だけx目盛りを表示するなど、ラベルが重ならない配置も検討します。共有する軸の範囲が全データを含むこと、外れ値や欠損が表示を歪めないことを確かめてください。
異なる尺度と単位を分ける
温度と電圧のように単位が異なる系列は、別のAxesへ分けると意味を混同しにくくなります。単に数値の桁が違うからといって二重y軸を使うと、任意の範囲調整で線の交差や相関を作り出せてしまうため慎重に扱います。別のサブプロットなら各軸の単位を明示でき、値の大きさや時間変化を独立に観察できます。比較の目的が変化のタイミングであればx軸を共有し、縦軸を独立にします。尺度を標準化した図を作る場合も、元の物理量と変換方法を表示し、変換後の値を実測単位と混同させないようにします。
タイトルとラベルの配置
各Axesに個別タイトルを付けると、その領域に描いたデータの条件が明確になります。Figure全体のタイトルには共通する対象や試験条件を記し、各Axesでは系列や統計量の違いを説明します。すべてのAxesへ同じxラベルを表示すると重複する場合があり、共有軸では下段だけ表示する方法が読みやすいことがあります。yラベルが複数並ぶと左側で重なるため、余白や位置を調整します。タイトルとラベルがFigureの外へ切れないか、保存した状態で確認してください。Axesの順番と見出しが図の読み順と一致し、読み手がどの条件を見ているか迷わない配置にします。
目盛り、グリッド、凡例
複数Axesを使う場合、目盛りやグリッドの密度を揃えると比較しやすい一方、異なる尺度を同じ間隔にすると誤解を招くことがあります。図の目的に合わせて設定し、各軸に単位を表示してください。凡例はAxesごとに置くか、複数系列をFigure全体の凡例へ集めるか選びます。全体凡例は領域を節約できますが、どの系列がどのAxesに対応するか分かりにくくなる場合があります。配置後に図を縮小し、凡例、目盛り、グリッドが重ならないことを確認します。凡例に似た名称が複数ある場合は、条件や単位を含む明確な名前に変更しましょう。
空のAxesをどう扱うか
データの種類がAxes数より少ない場合、空の領域を表示しない、説明を置く、後で削除するなどの方法があります。空のAxesを残すと欠落データがあるのか単に未使用なのか不明になるため、意図を示してください。delaxesやset_visibleを使う場合、残りのAxesの配置や共有軸が期待通りか確認します。データが不足したときに別系列を無理に複製して埋めると、虚偽の情報を表示することになります。入力の件数とAxes数を照合し、条件が満たされない場合は明確なエラーを出す設計も検討します。自動レポートでは、欠けたグラフの理由を本文やログへ記録します。
タイトレイアウトと余白
tight_layoutやconstrained_layoutは、タイトルや軸ラベルが重ならないようにFigure内の配置を調整します。Figureのサイズ、Axes数、長い日本語ラベルにより調整結果が変わるため、最終出力を確認してください。bbox_inchesを指定して保存すると余白を含めた範囲を出力できますが、別の図と画像サイズが揃わなくなる場合があります。図の寸法を揃える必要があるレポートでは、余白調整とファイルサイズのバランスを考えます。レイアウト調整を過剰に繰り返すより、ラベルを短くする、列数を変える、Figureを大きくする方が効果的なことがあります。
サブプロットの種類を選ぶ
subplotは格子状の等しいAxesを作るのに便利ですが、比較の重要度やデータ量が異なる場合、同じ大きさの領域が適切でないことがあります。GridSpecやwidth_ratios、height_ratiosで配置を調整できます。共有する共通軸を持つ系列は上下または左右へ並べ、異なる種類のグラフを組み合わせる場合は視線の流れを考えて配置します。Axesを不規則に並べると読み順が分かりにくくなるため、タイトルやラベルで関係を説明してください。レイアウトを複雑にする前に、図を複数ファイルへ分けた方が伝わりやすいか検討します。
出力と資源の管理
Figure全体をfig.savefigで保存し、ファイル形式、dpi、背景、余白を用途に合わせます。各Axesだけを個別画像へ切り出すと、共有軸やFigure全体のタイトルが失われることがあるため、必要な情報を確認してください。多数のFigureを生成した後はcloseで閉じ、メモリーが増え続けないようにします。自動生成では出力ファイルを一時場所に作成して内容を確認後に公開する方法もあります。保存に失敗した場合に前回の画像が残って成功に見えないよう、生成日時や実行状態を管理します。画面のない環境で出力できるか、テストやCIでも確かめましょう。
練習課題:複数条件を並べる
異なる三条件の温度と電圧を測ったデータを、二行一列のAxesへ配置します。x軸を共有し、上段に温度、下段に電圧を表示して、それぞれの単位と条件を明記してください。Axes配列をループして共通設定を行い、欠けた条件がある場合には空白を無言で残さず説明を追加します。次に軸を共有しない図と比較し、どちらが条件間の差を理解しやすいか評価します。レイアウトを調整しPNGとPDFへ保存し、文字切れ、ファイル寸法、系列順を確認してください。テストでAxes数、共有軸、タイトル、ラベルを検証し、意図した図であることを確かめます。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1, sharex=True)
axes[0].plot([0, 1, 2], [3.2, 3.3, 3.1])
axes[0].set_ylabel("電圧 (V)")
axes[1].plot([0, 1, 2], [0.1, 0.2, 0.15])
axes[1].set_ylabel("電流 (A)")
axes[1].set_xlabel("時間 (s)")
plt.show()手を動かす課題
電圧と電流を上下に配置し、共有する軸と独立させる軸を選んだ理由を説明してください。