TeXのTikZによるグラフ描画
概要
TikZは、TeXのメジャーな描画コマンド群です。
以下でTikZのポイントを説明します。ソースのコメントにも説明がありますので見てください。
この記事の図は、TeXで出力したPDFファイルをPNGファイルに変換したものを使っています。PNGファイルへの変換方法も説明しています。
今回は、Mac環境のみで調べました。
TeXの準備
TeXが普通にインストールされていればTikZが使えるはずです。TeXのインストールについては、次を見て頂くのが良いと思います。
- TeX Wikiのインストール
- [改訂第6版] LaTeX2ε美文書作成入門の「付録A 付録DVDを用いたインストールと設定」
TikZの利用
TikZの概要を簡単に説明します。詳細は参考資料のリンクを見て下さい。
TikZはTeXの色々な(jsarticle, standalone等の)書式で使えます。standalone書式を使えば、画像だけをPDFにできます。
TikZパッケージを読み込むにはdocument環境の手前のプリアンブルに次のように記述します。
¥usepackage{tikz} % tikzパッケージを読み込む
TikZによる描画方法の一つは、document環境内で、次のように記述します。TikZコマンドの最後には;
を付けます。これは線を2本描いています。
¥tikz{¥draw(0,0)--(1,1);¥draw(0,1)--(1,0);}
もう一つの描画方法は、tikzpicture環境にTikZのコマンドを並べて描画します。次の例を見て下さい(PNGに変換した時に端が切れることがあるようです。)
TikZ_box1.tex
¥documentclass[dvipdfmx]{standalone} % 書式standaloneでdvipdfmxを使ってPDF生成 ¥usepackage{tikz} % tikzパッケージを読み込む ¥begin{document} % document環境開始 ¥begin{tikzpicture} % tikzpicture環境開始 ¥draw (0bp, 0bp) rectangle (280bp,120bp); % 四角枠を描画 ¥draw (0bp,0bp) node[above right] {(0,0)}; % 指定座標の右上に{}内の文字列を描画 ¥draw (280bp, 120bp) node[below left] {(280, 120)}; ¥end{tikzpicture} % tikzpicture環境終了 ¥end{document} % document環境終了
(0,0)が左下。X軸は上向きでY軸は右向きなので数学の座標系と同じです。
図の描画されるバウンディングボックスは、中身がぴったり入るように決まります。
バウンディングボックスを指定する場合は、tikzpicture環境の最初に¥useasboundingbox
を記述します。
TikZ_box2.tex
¥documentclass[dvipdfmx]{standalone} % 書式standaloneでdvipdfmxを使ってPDF生成 ¥usepackage{tikz} % tikzパッケージを読み込む ¥begin{document} % document環境開始 ¥begin{tikzpicture} % tikzpicture環境開始 ¥useasboundingbox (-20bp,-20bp) rectangle (300bp,140bp); % バウンディングボックス指定 ¥draw (0bp, 0bp) rectangle (280bp,120bp); % 四角枠を描画 ¥draw (0bp,0bp) node[above right] {(0,0)}; % 指定座標の右上に{}内の文字列を描画 ¥draw (280bp, 120bp) node[below left] {(280, 120)}; ¥end{tikzpicture} % tikzpicture環境終了 ¥end{document} % document環境終了
ピクセル単位を指定する方法
TeXでは、次のような長さの単位を使えます。
cm、mm、in、pt、pc、bp、sp、em、ex、zw、zh、Q、H
TikZでは、長さの単位を指定しなかった場合のデフォルトはcm(センチメートル)単位になります。
TeXの長さの単位にピクセル単位はありませんが、bp(ビッグポイント、DTPポイント)は事実上ピクセル単位と同じ意味になります。
bpは1/72インチで、1インチは2.54cmなので、1bpは0.035277...cmです。TeXは72dpiなのでbp単位が丁度ピクセル単位になります(画像ファイルは独自にdpiが設定されていることがあります)。
詳しくは次のリンクを見て下さい。
色指定
TikZでは、xcolorパッケージで色を使います。xcolorパッケージは、tikzパッケージから読み込まれるので¥usepackage{xcolor}
の必要はありません。
色名は次のものが使えます。
red, green, blue, brown, lime, orange, pink, purple, teal, violet,
cyan, magenta, yellow, olive,
black, darkgray, gray, lightgray, white
さらに、black!10(黒10%白90%)、red!20!green(赤20%緑80%)の様な指定ができます。
他に、CYMK、RGB、HTML同様の16進記法も使えます。色名をさらに68個追加する方法もあります。
詳細は、次を見て下さい。
- [改訂第6版] LaTeX2ε美文書作成入門の「7.11 色の指定」
数式のグラフ描画例
多項式やベキやルートやlogのグラフは簡単に描画できます。
TikZ_math.tex
¥documentclass[dvipdfmx]{standalone} % 書式standaloneでdvipdfmxを使ってPDF生成 ¥usepackage{tikz} % tikzパッケージを読み込む ¥usetikzlibrary{shadows} ¥begin{document} % document環境開始 ¥begin{tikzpicture}[domain=0:3, samples=100, very thick] % 定義域、点の数、線幅 ¥draw (0,0) node[below left]{O}; % 原点、0でも、above, below, left, rightで位置指定 % 位置指定はanchor=north, south, east, westでも可能 ¥draw[thick, ->] (-0.5,0)--(3.2,0) node[right] {$x$}; % x軸、[->]で矢印、他に[-stealth]等 ¥draw[thick, ->] (0,-1.2)--(0,3.2) node[above] {$y$}; % y軸 ¥draw plot(¥x, {sqrt(¥x)}) node at(1.9,1.9) {$y=¥sqrt{x}$}; % atでnodeの位置指定 ¥draw plot(¥x, ¥x*¥x-2*¥x) node[above] {$y=x^2-2x$}; % 多項式 ¥draw plot(¥x, {exp(-0.5 * ¥x * ¥x)}) node[above] {$y=e^{-x^2¥!/2}$}; % exp ¥draw [domain=0.7:3.7] plot(¥x, {ln(¥x)}); % y=log(x) 定義域を個別指定 ¥node at(4,1) {$y=¥log x$}; ¥draw [thin, domain=-0.4:3.7] plot(¥x,¥x/e); % y=x/e、細線幅 ¥node at(4.2,1.4){$y=¥frac{x}{e}$}; ¥draw [thin, domain=0.4:3.7] plot(¥x, {(¥x-1)/(e-1)}); % y=(x-1)/(e-1) ¥node [above, font=¥scriptsize, fill=white, inner sep=0pt] % 途中で改行 at(0,0.4){$y=¥frac{1}{e-1}(x-1)$}; % node追加設定 ¥draw [very thin, dashed](0,1) node [left]{$1$}--(e,1)--(e,0) node[below]{$e$}; % 補助線 ¥draw [very thin, dashed](1,0) node [below]{$1$}--(1,1); ¥end{tikzpicture} ¥end{document} % document環境終了
円や楕円やベジエ曲線も描けます。sin関数、cos関数、放物線などの描画は結構面倒です。次を見てください。
他に、RでTikZのコードを出力したり、TikZからgnuplotを呼び出す方法があります。少々手間がかかります。次を見てください。
- [改訂第6版] LaTeX2ε美文書作成入門の「D.6 Rで使う方法」、「D.7 gnuplotとの連携」
理系ジンのアイコン描画例
CanvasやSVGの記事と同様にTikZで、理系ジンのアイコンを描画してみます。
TikZ_Rz.tex
¥documentclass[dvipdfmx]{standalone} % 書式standaloneでdvipdfmxを使ってPDF生成 ¥usepackage{tikz} % tikzパッケージを読み込む ¥usetikzlibrary{shadows} ¥begin{document} % document環境開始 ¥begin{tikzpicture} ¥useasboundingbox (0bp,0bp) rectangle (240bp,240bp); ¥filldraw[fill=lightgray,draw=lightgray,rounded corners=10bp, % 影付きの角の丸い四角 general shadow={fill=black,shadow xshift=10bp,shadow yshift=-10bp, opacity=.5}] % 影 (10bp, 10bp) rectangle (230bp,230bp); ¥filldraw[fill=white,draw=white] (20bp, 20bp) rectangle (220bp,220bp); % 内側の白い四角 ¥draw[lightgray] (20bp,20bp) node[above right] {¥fontsize{200bp}{200bp}¥selectfont ¥gtfamily 理}; % 理 ¥end{tikzpicture} ¥end{document} % document環境終了
周囲の白い部分は、Canvasの場合は透明でしたが、このPNG画像は白になっています。
Canvasの場合とは、フォントの太さや影のぼかしが無い点が違っていますが、実現可能だと思います。次を見てください。
- 「TikZ & PGF Manual」のShadow Libraryの章
TikZのPNGファイルへの変換
TikZの図をPNGにするには、PDFを表示した画面をキャプチャしてもできますが、ツールを使う方法を紹介します。
TeXと一緒にインストールされるImageMagickと言うツールのconvertを使ってPDFファイルをPNGファイルに変換できます。
$ convert Desktop/rikeizine/TeX/TikZ_box1.pdf Desktop/rikeizine/TeX/TikZ_box1.png $ convert Desktop/rikeizine/TeX/TikZ_box2.pdf Desktop/rikeizine/TeX/TikZ_box2.png $ convert Desktop/rikeizine/TeX/TikZ_math.pdf Desktop/rikeizine/TeX/TikZ_math.png $ convert Desktop/rikeizine/TeX/TikZ_Rz.pdf Desktop/rikeizine/TeX/TikZ_Rz.png
最近のTeXを使っている場合は、standalone書式では、TeX文書のプリアンブルで、次のようにドライバオプションを指定すればImageMagickのconvertコマンドを使いPNGファイルを生成できるようです(理系ジンのTeXの環境は、少し古く使えませんでした)。
\documentclass[convert={density=300,size=1080x800,outext=.png}]{standalone}
解像度やサイズを設定する事もできます。詳しくは、次を見てください。
生成されたPNGファイルを見ると、TikZでfill
やdraw
していない所は透明になっています。画像の端は切れる事があるようです(PDFでは表示されているのに)。端に細い線は描かない方が良さそうです。
PDFファイルやPNGファイル等のサイズが必要であれば、次のようにしてxbbファイルを生成すれば良いです。
$ extractbb Desktop/rikeizine/TeX/*.pdf
次のような内容のファイルが出力されます。
TikZ_box1.xbb
%%Title: ./Desktop/rikeizine/TeX/TikZ_box1.pdf %%Creator: extractbb 20130405 %%BoundingBox: 0 0 280 120 %%HiResBoundingBox: 0.000000 0.000000 280.400000 120.400000 %%PDFVersion: 1.5 %%Pages: 1 %%CreationDate: Fri Oct 10 15:57:21 2014
%%BoundingBox: 0 0 280 120
を見るとピクセルのサイズが分かります。
TikZのSVGへの変換
多くの人が、次の方法でTikZをSVGへ変換しているようです。
詳細は、検索をお願いします。
TikZのCanvasへの変換
いい方法は無さそうでした。
理系ジンの意見
TikZの描画の記述の難易度はCanvasやSVGと同程度です。TikZ自体の数式のグラフの描画機能は意外に限られていました。
散布図などの統計のグラフの描画はRの方がはるかに簡単そうです。複雑な数式は始めからgnuplotを使う方が良いかも知れません。
適材適所になります。全てに理想的なグラフ描画方法はなかなかありません。
PNGファイルを生成するのは少しだけ面倒です。
次回の予定
次回は、数式のグラフ描画をGUIでおこなえるGeoGebraの記事の予定です。
参考資料
- [改訂第6版] LaTeX2ε美文書作成入門の「付録D TikZ」など
- CTAN: Package pgf:PDFの「TikZ & PGF Manual」など
- TeXがインストールされている環境では
$ texdoc tikz
で「TikZ & PGF Manual」表示
- TeXがインストールされている環境では
- TeX Wiki:インストールやTikZなど
- TeXample.net:TikZのExampleなど
- TikZを使ってみよう! - Cute.Guides:簡潔
- 人ごとな独り言:TikZの簡潔な解説など
- ナントカBoxの話(4) - マクロツイーター:bp単位の意味の解説
- 日本人のための LaTeX タブー集 ~画像読込編~ - Qiita:ピクセル単位の指定の仕方
- ImageMagick:TeXと一緒にインストールされる
- writeLaTeX:ネットでTeXを試すのに便利なWebサービス(要登録)
- Tasuku Soma’s webpage:TikZ、Beamer、nodeが詳しい