LaTeXレポートに美しいグラフを描く方法(PGFPlots入門)

2026-07-01

LaTeXで実験レポートや論文を書いていると、グラフの挿入で悩むことがありませんか。

多くの場合、ExcelやPythonで作成したグラフを PNGPDF で保存し、\includegraphics で貼り付けます。しかしこの方法にはデメリットがあります。

  • フォントが本文と揃わない(画像の文字だけゴシック体になったり、大きさが違ったりする)
  • 画質が劣化する(PNG等のラスター画像は拡大するとぼやける)
  • 後から微調整するのが面倒(軸ラベルを少し変えたいだけでも元のソフトを開き直す必要がある)

そこでおすすめしたいのが、「PGFPlots」パッケージでLaTeXのソースコード内に直接グラフを描く方法です。

PGFPlotsとは

PGFPlotsは、LaTeX上で高品質なグラフを描画するためのパッケージです。TikZ(描画パッケージ)をベースにしており、データをコードとして記述することで、本文と完全に同じフォント・同じ解像度でレンダリングされます。

メリット

  1. ベクター描画 — どんなに拡大してもぼやけません
  2. フォントの完全一致 — 軸ラベルの数式も $E=mc^2$ と書けば本文と同じスタイルで出力されます
  3. ファイルサイズの削減 — 重い画像ファイルを含まないため小さくなります
  4. 差分管理ができる — テキストなので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
線種dasheddottedthickvery thick
軸の範囲xmin=0, xmax=10, ymin=0, ymax=5
凡例の位置legend pos=north westsouth east 等も可)
軸を左と下だけにするaxis lines=left
グリッド線grid=majorgrid=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 は「誤差を明示的に指定する」という意味です。yy 方向だけでよければ x dir の行は不要です。

誤差棒の値の求め方は誤差伝播の解説を参照してください。

対数軸にする

片対数・両対数のグラフは、axis 環境を置き換えるだけで描けます。

プロット環境
通常\begin{axis}
片対数(yy 軸のみ対数)\begin{semilogyaxis}
片対数(xx 軸のみ対数)\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 largeTeXの数値範囲を超えた。極端に大きい・小さい値を扱っている。データを事前にスケーリングする(例:10610^{-6} 倍して軸ラベルに単位を書く)
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からデータをコピペするだけで次を行います。

  1. 近似曲線をブラウザ側で自動計算する
  2. PGFPlots用の完全なLaTeXコードを生成する
  3. 計算エラーを防ぐため、近似線を「数式」ではなく座標点の列として出力する

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グラフ生成ツールにデータを貼り付けてみてください。