組み込み開発のためのPython · レッスン 128 / 238
Matplotlib Intro:図の基本を知る
MatplotlibはPythonでグラフを作成するライブラリーです。FigureとAxesの関係を理解し、データ、描画方法、ラベル、保存形式を分けて考えます。
MatplotlibはPythonでグラフを作成するライブラリーです。FigureとAxesの関係を理解し、データ、描画方法、ラベル、保存形式を分けて考えます。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。
Matplotlibで図を作る目的
MatplotlibはPythonの数値データを図として表示・保存するライブラリーです。測定値の時間変化、カテゴリ別の比較、分布、二つの変数の関係などを視覚的に確認できます。グラフは分析や説明を助けますが、表示方法だけでデータの偏りや因果関係が解決するわけではありません。使用するデータの出所、単位、標本数、処理方法を合わせて示し、読み手が図の限界を理解できるようにします。導入時には仮想環境へMatplotlibを追加し、使用するバックエンドが画面表示やファイル保存に対応しているか確かめます。
FigureとAxesを理解する
Figureは出力する図全体、Axesはデータと軸を持つ描画領域です。plt.subplotsを使うとFigureとAxesを明示的に作成でき、タイトルやラベル、凡例を対象のAxesへ設定できます。複数のグラフを作る場合、どのAxesにどの系列を描くかを変数で管理すると、暗黙の現在状態に依存しにくくなります。図の幅や高さはインチ単位で指定し、保存時のdpiと組み合わせて出力解像度を調整します。描画領域の数と配置を先に決め、データの種類に合う可視化を選んでください。オブジェクトを明示する書き方はテストや再利用にも役立ちます。
最初の線グラフを描く
plotは順序を持つ数値系列を線で結びます。横軸に時刻、縦軸に測定値を渡す場合、二つの配列の長さと対応する順番が一致することを確認してください。データが不等間隔に取得されているのに横軸をサンプル番号にすると、時間変化の速度を誤って見せる場合があります。線で結ぶことが適切なのは、順序や連続性に意味があるデータです。独立したカテゴリ間を線で結ぶと、存在しない中間値を示すように見えることがあります。点のマーカーを追加するか、棒グラフや散布図へ切り替えるかをデータの意味から選びます。
軸ラベル、単位、タイトル
軸ラベルには読み手に通じる変数名と単位を付けます。値がミリ秒なのか秒なのか、温度が摂氏か華氏かを省略すると、図を再利用する人が誤った結論を出す可能性があります。タイトルには対象機器や測定条件など、図だけでは分からない文脈を簡潔に含めます。長い文字列は重なりや切り捨てを起こすため、図のサイズ、目盛り、余白を調整してください。日本語フォントが環境にない場合は文字化けすることがあるので、出力環境で実際に確認します。軸の単位や範囲を変えたときは、図の説明にも変更を反映し、古い解釈を残さないようにします。
目盛りと軸の範囲を選ぶ
目盛りは値の規模や変化を読み取る助けになります。軸の範囲を自動にすると極端な値で他の差が見えにくくなる場合があり、固定範囲は比較しやすくする一方で範囲外のデータを隠す可能性があります。ゼロを基準にすべき棒グラフと、微小な変動を拡大して見る折れ線グラフでは、適切な範囲の考え方が異なります。切り詰めた軸を使う場合は、その事実を明示してください。対数軸は桁の違う値を見やすくすることがありますが、ゼロや負の値を表示できず、読み手に直感的でない場合もあります。軸設定の根拠を説明し、異なる設定の図も比較しましょう。
複数系列と凡例
複数系列を同じAxesに描くと比較できますが、重なりや色の似すぎで読みづらくなることがあります。各系列へ意味のあるラベルを付け、legendで凡例を表示します。基準条件と変更条件を比較する場合、データの期間、サンプル数、単位が同じか確かめてください。凡例は線の近くや空いている場所に配置し、図のデータを覆わないようにします。色だけで系列を区別せず、線種やマーカーも使うと、白黒印刷や色覚特性の異なる読み手にも伝わりやすくなります。凡例に含めた名称が実際のデータ列や測定条件と一致していることを検証します。
グリッドと視認性
グリッド線は値を読み取る補助になりますが、線が濃すぎたり多すぎたりするとデータより目立ちます。グリッドの透明度や表示する軸を調整し、主目盛りと補助目盛りを区別してください。背景、線、文字のコントラストを十分に取り、フォントサイズを小さくしすぎないようにします。表示画面、印刷、スマートフォンなど実際の利用環境で図を確認しましょう。極端に細い線や色のみで伝える注釈は見えにくくなる場合があります。図を使うレポートやWebページでは、本文で重要な傾向を説明し、色や配置だけに情報を閉じ込めないこともアクセシビリティの一部です。
データに合うグラフを選ぶ
時系列の推移には折れ線、カテゴリの比較には棒、二つの数値の関係には散布図、分布にはヒストグラムなど、目的に応じてグラフを使い分けます。円グラフは全体に占める割合を示せますが、カテゴリが多い場合や値が近い場合には比較しにくくなります。ヒストグラムのビン幅によって見える分布が変わるため、設定と標本数を示してください。散布図に強い相関が見えても、それだけで一方が他方を引き起こすとはいえません。複数の測定条件や時間順序を確認し、必要ならグループごとに色分けします。読み手が判断する問いを先に定め、その問いに答える図を選びましょう。
欠損、外れ値、サンプル数を示す
欠損値や無効な測定値を図から除いた場合、その件数と除外規則を記録してください。空白部分を線でつないでしまうと、測定が連続して行われたように誤解される可能性があります。外れ値は誤入力だけでなく重要な異常事象であることもあるため、理由を調査せずに消さないでください。分布を描くときはサンプル数を示し、少数データから安定した形が分かったように断定しないようにします。平均線や誤差範囲を追加する場合、何の統計量か、どの方法で計算したかを説明します。図が元データの一部だけを示すなら、選択条件も明記してください。
Figureを画像ファイルへ保存する
savefigを使うと図をPNG、SVG、PDFなどの形式で保存できます。ラスター形式は画素数とdpi、ベクター形式は拡大時の線や文字の品質が異なります。Web表示や印刷などの用途に応じて形式を選び、保存先のディレクトリ、ファイル名、上書き動作を確認します。tight_layoutやconstrained_layoutはラベルの重なりを減らす助けになりますが、出力画像を開いて確認する必要があります。自動生成物は再実行時に上書きされるため、元データや手作業で修正した画像を意図せず失わないようにしてください。画像とともにスクリプト、データ条件、ライブラリーの版を保存すると再生成しやすくなります。
バックエンドと画面表示の違い
Matplotlibのバックエンドは図を画面へ表示したり、画像ファイルへ描画したりする仕組みです。ローカルPCではウィンドウが開いても、サーバーやCIのように画面がない環境では対話表示が失敗することがあります。自動処理では非対話バックエンドを使い、savefigで出力する方法を選べます。バックエンドを切り替える設定は、描画処理を始める前に行う必要がある場合があります。利用環境の設定やインストール済みGUIライブラリーを確認し、表示できない環境でもテスト可能な出力経路を用意しましょう。保存に成功しただけで図が正しいとは限らないため、画像の寸法や内容も検証します。
図を自動生成するときのテスト
バッチ処理やレポート生成では、同じ入力から図を再現できるようにします。乱数データを使うなら生成器を固定し、データ順序、図の軸、系列数、保存パスをテストしてください。画像ファイルのバイト列を環境をまたいで完全一致させる比較は、フォントやライブラリー版の違いで不安定になることがあります。代わりに描画関数へ渡した値やファイルの存在・形式・寸法を確認し、重要な図は人が目視でレビューします。処理失敗時に古い画像を新しい結果だと誤認しないよう、出力日時や生成状態を管理してください。エラーを隠して空のグラフを正常結果として扱わないことも大切です。
練習課題:測定結果を伝える図
複数チャンネルの測定値を用意し、時系列の折れ線、チャンネル別の棒、全データのヒストグラムを作ってください。各図に質問を設定し、軸名と単位、標本数、欠損の扱いを含めます。軸範囲やビン数を変更した場合に、読み取れる傾向がどう変わるか比較し、図の設定だけで結論が強く見えないか考えます。系列を色だけに頼らず区別し、PNGへ保存して画面と印刷の両方で読めるか確認します。最後に、データをどう選び、何を除外し、図が示さないことは何かを短く説明してください。図を作るコードを関数化し、空データや異常値を入力した場合の動作もテストします。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
import matplotlib.pyplot as plt
values = [3.29, 3.31, 3.28]
fig, ax = plt.subplots()
ax.plot(values, marker="o")
ax.set_ylabel("電圧 (V)")
plt.show()手を動かす課題
三つの測定値を描き、横軸にサンプル番号、縦軸に単位を付けた図を作ってください。