LaTeXレポートに美しいグラフを描く方法(PGFPlots入門)
2026-07-01
LaTeXで実験レポートや論文を書いていると、グラフの挿入で悩むことがありませんか。
多くの場合、ExcelやPythonで作成したグラフを PNG や PDF で保存し、\includegraphics で貼り付けます。しかしこの方法にはデメリットがあります。
- フォントが本文と揃わない(画像の文字だけゴシック体になったり、大きさが違ったりする)
- 画質が劣化する(PNG等のラスター画像は拡大するとぼやける)
- 後から微調整するのが面倒(軸ラベルを少し変えたいだけでも元のソフトを開き直す必要がある)
そこでおすすめしたいのが、「PGFPlots」パッケージでLaTeXのソースコード内に直接グラフを描く方法です。
PGFPlotsとは
PGFPlotsは、LaTeX上で高品質なグラフを描画するためのパッケージです。TikZ(描画パッケージ)をベースにしており、データをコードとして記述することで、本文と完全に同じフォント・同じ解像度でレンダリングされます。
メリット
- ベクター描画 — どんなに拡大してもぼやけません
- フォントの完全一致 — 軸ラベルの数式も
$E=mc^2$と書けば本文と同じスタイルで出力されます - ファイルサイズの削減 — 重い画像ファイルを含まないため小さくなります
- 差分管理ができる — テキストなのでGitで変更履歴が追えます
デメリット
- コンパイルが遅くなる(点数が多いと顕著。後述の対策あり)
- 記法を覚える必要がある
- TeXの計算能力が低いため、複雑な数式でエラーが出ることがある
基本的な使い方
プリアンブル(\begin{document} の前)でパッケージを読み込みます。
\usepackage{pgfplots}
\pgfplotsset{compat=1.18} % バージョン指定(必須)
compat の指定は必須です。省略すると警告が出るうえ、将来のバージョンで挙動が変わる可能性があります。
本文中のグラフを入れたい場所に次のように書きます。
\begin{figure}[htbp]
\centering
\begin{tikzpicture}
\begin{axis}[
width=10cm,
height=8cm,
xlabel={時間 $t$ [s]},
ylabel={速度 $v$ [m/s]},
grid=major,
]
% データのプロット
\addplot[only marks, color=blue, mark=*]
coordinates {(1, 2.1) (2, 4.0) (3, 6.2) (4, 7.9)};
\addlegendentry{測定データ}
% 理論曲線のプロット(数式で指定)
\addplot[domain=0:5, color=red, thick] {2*x};
\addlegendentry{理論式 $v = 2t$}
\end{axis}
\end{tikzpicture}
\caption{速度の時間変化}
\end{figure}
青い丸のデータ点と赤い直線が描かれたグラフが出力されます。
よく使うオプション早見表
\begin{axis}[...] や \addplot[...] に指定するオプションのうち、レポートで使用頻度の高いものをまとめます。
| やりたいこと | 書き方 |
|---|---|
| マーカーのみ表示(線でつながない) | only marks |
| マーカーの形 | mark=*(●)、mark=square*(■)、mark=triangle*(▲)、mark=o(○) |
| マーカーの大きさ | mark size=2pt |
| 線種 | dashed、dotted、thick、very thick |
| 軸の範囲 | xmin=0, xmax=10, ymin=0, ymax=5 |
| 凡例の位置 | legend pos=north west(south east 等も可) |
| 軸を左と下だけにする | axis lines=left |
| グリッド線 | grid=major、grid=both |
| 目盛りを内向きに | tick align=inside |
| 白黒印刷向け | color=black, mark=o |
理系レポートでは、グリッドを消して軸を左と下だけにする体裁が好まれる分野もあります。 分野ごとの作法はグラフの体裁ガイドにまとめています。
エラーバーを描く
実験レポートで欠かせないのが誤差棒です。PGFPlotsでは error bars で指定します。
\addplot[
only marks, mark=*,
error bars/.cd,
y dir=both, y explicit,
x dir=both, x explicit,
] coordinates {
(1, 2.1) +- (0.05, 0.2)
(2, 4.0) +- (0.05, 0.3)
(3, 6.2) +- (0.05, 0.2)
};
+- (x誤差, y誤差) の形で各点に誤差を付けます。y dir=both は上下両方向、y explicit は「誤差を明示的に指定する」という意味です。 方向だけでよければ x dir の行は不要です。
誤差棒の値の求め方は誤差伝播の解説を参照してください。
対数軸にする
片対数・両対数のグラフは、axis 環境を置き換えるだけで描けます。
| プロット | 環境 |
|---|---|
| 通常 | \begin{axis} |
| 片対数( 軸のみ対数) | \begin{semilogyaxis} |
| 片対数( 軸のみ対数) | \begin{semilogxaxis} |
| 両対数 | \begin{loglogaxis} |
\begin{semilogyaxis}[xlabel={時間 $t$ [s]}, ylabel={電圧 $V$ [V]}]
\addplot[only marks] coordinates {(0,5.00) (1,3.03) (2,1.84) (3,1.12)};
\end{semilogyaxis}
指数関数的な減衰が直線になるので、時定数を読み取るのに便利です。
外部ファイルからデータを読む
データ点が多い場合、座標を直接書くとソースが読みづらくなります。別ファイルに置いて読み込めます。
data.dat を次のように用意し、
t v dv
1.0 2.1 0.2
2.0 4.0 0.3
3.0 6.2 0.2
\addplot table で読み込みます。
\addplot[only marks, error bars/.cd, y dir=both, y explicit]
table[x=t, y=v, y error=dv] {data.dat};
列名で指定できるので、データを差し替えてもコードを直す必要がありません。
第2軸(右側の軸)を使う
異なる単位の量を1つのグラフに重ねる場合は、axis y line を使って2つの axis 環境を重ねます。
\begin{tikzpicture}
\begin{axis}[axis y line*=left, ylabel={電圧 $V$ [V]}, xlabel={時間 $t$ [s]}]
\addplot[blue, mark=*] coordinates {(1,2.1) (2,4.0) (3,6.2)};
\end{axis}
\begin{axis}[axis y line*=right, axis x line=none, ylabel={電流 $I$ [A]}]
\addplot[red, mark=square*] coordinates {(1,0.5) (2,0.9) (3,1.4)};
\end{axis}
\end{tikzpicture}
左右の軸で目盛り線の本数を揃えると格段に読みやすくなります。ytick を明示的に指定して調整してください。
コンパイルが遅いときの対策
データ点が多いと、毎回のコンパイルで数十秒かかることがあります。external ライブラリを使うと、各グラフを一度だけPDFに書き出してキャッシュしてくれます。
\usepgfplotslibrary{external}
\tikzexternalize
コンパイル時に -shell-escape オプションが必要です。グラフを変更しない限り再描画されないので、本文の推敲が非常に快適になります。
よくあるエラーと対処
| エラー | 原因と対処 |
|---|---|
Dimension too large | TeXの数値範囲を超えた。極端に大きい・小さい値を扱っている。データを事前にスケーリングする(例: 倍して軸ラベルに単位を書く) |
Package pgfplots Warning: running in backwards compatibility mode | \pgfplotsset{compat=1.18} を書き忘れている |
| 日本語が出ない・文字化けする | LuaLaTeXなら luatexja、upLaTeXなら適切なフォント設定を確認 |
| グラフが図の枠からはみ出す | width / height を指定するか scale で調整 |
| 凡例が本体に重なる | legend pos を変えるか legend style={at={(1.02,1)}, anchor=north west} で外に出す |
Dimension too large は特によく遭遇します。TeXの計算エンジンは元々組版用で、高度な浮動小数点演算を苦手としています。近似曲線を数式のままLaTeXに計算させると起きやすいエラーです。
近似曲線を含むグラフを楽に作る
前節のとおり、実験データから最小二乗法で求めた近似曲線をPGFPlotsに数式で計算させるとエラーが出やすくなります。
当サイトのLaTeXグラフ生成ツールは、Excelからデータをコピペするだけで次を行います。
- 近似曲線をブラウザ側で自動計算する
- PGFPlots用の完全なLaTeXコードを生成する
- 計算エラーを防ぐため、近似線を「数式」ではなく座標点の列として出力する
3番目が要点です。TeXに計算させず、あらかじめ計算した座標を並べることで Dimension too large を回避できます。出力されたコードをレポートに貼るだけで完成します。
近似だけ先に済ませたい場合は、直線あてはめなら最小二乗法ツール、多項式・指数・対数のフィッティングなら曲線近似ツールをご利用ください。どちらもPGFPlotsコードとLaTeXの表組み(tabular)を同時に出力できます。
まとめ
- PGFPlotsを使うと本文と同じフォント・ベクター品質でグラフが描ける
\pgfplotsset{compat=1.18}の指定を忘れない- エラーバーは
error bars/.cdと+- (dx, dy)で書ける - 対数軸は
semilogyaxis/loglogaxisに置き換えるだけ - 点数が多いなら
externalライブラリでコンパイル時間を短縮 Dimension too largeは座標点として出力すれば回避できる
コードを手書きするのが面倒なら、LaTeXグラフ生成ツールにデータを貼り付けてみてください。