2015年8月6日

pgfplots

グラフを描くためのpgfplotsパッケージ.

はじめに

こんなグラフを描きたくなったりはしないでしょうか?

$y = x^3 - x$のグラフです.LaTeXでこのようなグラフを描く手段はいくつかありますが,pgfplotsはそれを実現するパッケージの一つです.その名の通り描画エンジンとしてPGFを使います.要するにナウいってことです.

かなり大きなパッケージで,マニュアルも500ページ以上あります.単なる上のようなグラフだけで無く,三次元のグラフや,データファイルをもとにしてグラフを作成するなんてこともできます.色々できすぎるので,ここでは上のような関数で指定された二次元のグラフを描いてみます.*1

使い方

W32TeX,TeX Liveどちらにも既に入っているので,改めてインストールする必要はないでしょう.プリアンブルは

\documentclass[dvipdfmx]{jsarticle}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
です.(platex + dvipdfmxの場合.ドライバ指定はtikzパッケージと同様の方法で行います.)\pgfplotssetはpgfplotsパッケージへの設定を行います.compat=1.12は「Version 1.12モード」で動かす設定です.後々pgfplotsパッケージがバージョンアップした場合,仕様の変更などが行われる可能性がありますが,この指定を入れておくことでバージョン1.12(現在の最新バージョン)との互換性を保った動きをしてくれます.

上のグラフは次のようにして描きました.

\begin{tikzpicture}
\begin{axis}[axis lines=center]
\addplot[samples=200,domain=-2:2]{x^3 - x};
\end{axis}
\end{tikzpicture}

Tikzユーザにはおなじみのtikzpicture環境で描画します.axis環境でx軸y軸を表示し,\addplotで関数の描画を行います.

\addplot

関数描画は\addplotで行います.$y = f(x)$のグラフを描きたい場合は,

\addplot[<option>]{f(x)};
とします.*2最後のセミコロンを忘れないようにしてください.引数はxを使います.利用可能な関数のうち
+,-,*(かけ算),/,^(冪),max,min,sin,cos,tan,cot,sec,cosec,atan,asin,acos,exp,ln,sqrt,abs(絶対値),pi(円周率,定数),e(自然対数の底,定数)
あたりは使うことが多そうです.何故かlogじゃなくてlnなのがはまりそうですが.sinやcosなどは度数法で扱われることに気をつけてください.そのためにdeg(弧度法→度数法),rad(度数法→弧度法)という関数があります.*3cos(deg(x))という形で使うことになるでしょう.計算自身は\pgfmathparseというPGFのマクロで行われるので,そのほか使える関数などはPGFのマニュアルの該当部分を参照してください.

実際の描画は等間隔にとったx座標の点に対してf(x)を計算し,線で結ぶことで行われます.samplesオプションでこの間隔(というか点の数)を指定します.最初の例を

\addplot[domain=-2:2]{x^3 - x};
とすると次のようになります.

少しがたがたしているのが……わかりませんね…….手元でやってみて拡大してもらった方がよさそうです.(わかりにくい場合はsamples=10などとして試してみるとわかりやすいです.)

domainオプションは変数の動く範囲を指定します.省略しても適当に定めてくれますが.例えば

\addplot[samples=200]{x^3 - x};
とするとこうなります.

……極大極小が見えないですね.ちなみにx座標とy座標の最大最小も適当にpgfplotsが定めてくれますが,これも指定可能です.(後述のaxis環境を参照.)

パラメータ表示$t\mapsto (f(t),g(t))$による指定も可能です.方法は

\addplot[<option>]({f(x)},{g(x)});
とします.やはり変数はxを使います.例えば
\addplot[samples=200,domain=0:2*pi]({cos(deg(x))},{sin(deg(x))});
とすると円になります.f(x)やg(x)を囲む{}はなくても動くことがありますが,つけておいた方がよいようです.(上の例では単に(cos(deg(x)),sin(deg(x)))とするとエラーになりました.)この例ではdomainオプションは必須です.

陰関数による指定はできないようです.ちなみにマクロも使えます.

\newcommand{\f}{x^3 - x}
\addplot[samples=200]{\f};
\newcommand{\n}{3}
\addplot[samples=200]{x^\n};

axis環境

デフォルトでは次のような座標軸を表示します.

座標軸はこのように全体を囲む形で指定されます.これは上のようにaxis linesをオプションで指定することで変更できます.x座標とy座標を個別に指定したい場合は,axis x lineとaxis y lineを使います.いずれもデフォルトは「box」です.「center」とすると上のように0の位置に引かれます.他には:

\begin{axis}[axis x line=top,axis y line=left]
\end{axis}

他には表示させなくするaxis x line=noneもあります.

座標の範囲自身は,pgfplotsパッケージがそれっぽいサイズにしてくれますが,指定することもできます.

\begin{axis}[axis lines=center,xmin=-2,xmax=4,ymin=-3,ymax=10]
\end{axis}

色々とつけてみます.

\begin{axis}[axis lines=center,title=グラフ,xlabel=$x$,ylabel=$y$,legend pos=outer north east]
\addplot[samples=200,domain=-2:2]{x^3};
\addlegendentry{$y = x^3$}
\addplot[dashed,samples=200,domain=-2:2]{x^2};
\addlegendentry{$y = x^2$}
\end{axis}

titleでタイトルを,x/ylabelでx軸y軸に名前をつけました.\addplotを二度以上使うことで複数のグラフを同時に描けます.区別するために二つ目の$y = x^2$の方にはdashedオプションをつけて破線にしました.このオプションはTikzから来ています.そのほか,dottedやdash dot,dash dot dotなどが有り,また頭にlooselyやdenselyをつけると微妙に変化します.白黒印刷を想定して破線にしましたが,色を変更することもできます.単純に\addplot[red,samples=200,domain=-2:2]{x^2};とすると赤くなります.

凡例をつけるには\addlegendentryを使います.直前の\addplotに対する凡例が表示されます.凡例の位置はlegend posオプションをaxisにつけることで行えます.ouetr north eastを指定してグラフの外に置きましたが,legend pos=north eastと指定するとグラフ内に置かれます.予想される通り,legend posには他にnorth west/south east/south westが指定可能です.

グラフを描画するその他の方法

色々な方法があるようです.殆ど使ったことはありませんが,適当に列挙してみます.

  • gnuplotを使う.グラフと言えばgnuplotですね.LaTeXと組み合わせるには.なお,pgfplotsでも
    \addplot[samples=200,domain=-2:2] gnuplot {x**3 - x};
    とすることで計算をgnuplotに行わせることができます.ただし,gnuplotがインストールされている必要があり,更にコンパイルには-shell-escapeが必要です.
  • KETpic.Maple/Mathematica/Maxima/Scilabの計算結果をLaTeXに取り込ませることができるようです.
  • WinTpic.図作成のWYSIWYGなツール.ただしWindowsに限る.図形→関数から関数を指定してのグラフが出力できます.
  • emath.小中高での算数・数学用のパッケージ.関数グラフを描くのに便利なマクロがあります.
  • Tikz.Tikz自身にもこういうグラフ出力の命令があります.TeX Wikiの例
*1
三次元についてもそのうち書けるといいなぁ.
*2
オプションがない場合でも\addplot[]{f(x)}と空のオプションを指定しておいた方がこの文脈ではよいでしょう.単に\addplot{f(x)}とすると,あるオプション指定が自動でなされてしまいます.[]をおくことでそれを打ち消すことができます.\addplot{f(x)}でどうなるかは試してみてください.
*3
\pgfplotssetにtrig format=radをつけると弧度法で扱ってくれるようになります.が,試しているとこれのせいでエラーが発生してしまったりもしました.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です