理系ジン

しばらくPythonに力を入れる予定です。

TeXのTikZによるグラフ描画

概要

TikZは、TeXのメジャーな描画コマンド群です。

以下でTikZのポイントを説明します。ソースのコメントにも説明がありますので見てください。

この記事の図は、TeXで出力したPDFファイルをPNGファイルに変換したものを使っています。PNGファイルへの変換方法も説明しています。

今回は、Mac環境のみで調べました。

TeXの準備

TeXが普通にインストールされていればTikZが使えるはずです。TeXのインストールについては、次を見て頂くのが良いと思います。

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に変換した時に端が切れることがあるようです。)

f:id:rikeizine:20141010181412p:plain

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を記述します。

f:id:rikeizine:20141010181503p:plain

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個追加する方法もあります。

詳細は、次を見て下さい。

数式のグラフ描画例

多項式やベキやルートやlogのグラフは簡単に描画できます。

f:id:rikeizine:20141010181647p:plain

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を呼び出す方法があります。少々手間がかかります。次を見てください。

理系ジンのアイコン描画例

CanvasSVGの記事と同様にTikZで、理系ジンのアイコンを描画してみます。

f:id:rikeizine:20141010182624p:plain

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でfilldrawしていない所は透明になっています。画像の端は切れる事があるようです(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へ変換しているようです。

  • TeXで生成したPDFファイルをInkscapeで開き、SVGで保存
  • 他に、tikz2svg、pdf2svg、dvisvgmなどのツールを利用

詳細は、検索をお願いします。

TikZのCanvasへの変換

いい方法は無さそうでした。

理系ジンの意見

TikZの描画の記述の難易度はCanvasSVGと同程度です。TikZ自体の数式のグラフの描画機能は意外に限られていました。

散布図などの統計のグラフの描画はRの方がはるかに簡単そうです。複雑な数式は始めからgnuplotを使う方が良いかも知れません。

適材適所になります。全てに理想的なグラフ描画方法はなかなかありません。

PNGファイルを生成するのは少しだけ面倒です。

次回の予定

次回は、数式のグラフ描画をGUIでおこなえるGeoGebraの記事の予定です。

参考資料