gnuplotとLaTeXで「美しい」グラフを作ってみる

  • 63
    いいね
  • 5
    コメント
この記事は最終更新日から1年以上が経過しています。

gnuplotとLaTeXで「美しい」グラフを作ってみる

この記事は、TeX & LaTeX Advent Calenderの23日目の記事となります。
前日の記事はneruko3114様のこちらの記事になります。

導入

全国のB4・M2が論文を書く時期に入りました。論文を書くソフトはもちろんLaTeXですよね?MSWordなんて使いませんよね?
論文に添えるグラフ作成にはgnuplotが便利ですが、gnuplotはあくまでグラフを出力する事専門のソフトなので、グラフのキャプションや凡例の文字は、こう言ってはなんですが無骨な印象を受けます。特に、LaTeXに取り込むためにEPSやPDFで出力した時に、その傾向は顕著になると思います。あれなんででしょうね。
今回はこのgnuplotで出力するグラフを、LaTeXと連携する事で、ちょっとだけ美しくしてみようという試みを投下してみようと思います。

正直こんなので参加してよかったんでしょうかね。

set terminal tikz

最近のgnuplotは、いくつかの(La)TeXで処理できる形式でグラフを出力するように設定する事ができます。
最近はTikzがトレンドという事で、これを利用してみようと思います。

今回はサンプルとして以下のようなプロット命令を用意します。

plot.plt
set terminal tikz
set output "graph.tex"
set xr[-5:5]
set title "テスト出力"
plot sin(x) t "$\\sin(x)$", cos(x) t "$\\cos(x)$", sin(x)+cos(x) t "合成波"

これをgnuplotに読ませると、以下のような出力が得られます。

graph.tex
\begin{tikzpicture}[gnuplot]
%% generated with GNUPLOT 4.6p1 (Lua 5.1; terminal rev. 99, script rev. 100)
...(以下略)

これはTikz環境だけが作成されているので、これを適当にincludeしてやれば、グラフが簡単に表示できるという訳です。
だいたい以下の感じにすればいいでしょう。プリアンブルは次節の出力を参考にしています。

main.tex
\documentclass[dvipdfmx]{jsarticle}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8x]{inputenc}
\usepackage{gnuplot-lua-tikz}
\begin{document}
\include{graph}
\end{document}

gnuplot-lua-tikzパッケージは、最近のgnuplotを入れていれば入っていると思います。

また当然の事ながら、作成されたTikz環境に手を加える事で、より美しい形に出力する事も可能です。

グラフを他のソフトでも使いたい!!

当然の事ながら、この方法で作成したグラフはTikz命令で書かれているので、他のソフトで利用する事はできません。
つまり、論文で使ったグラフをパワーポイント等にはりつけるためには、一度論文から切り出す必要があって面倒です。
プレゼンテーションもBeamerなどで作ってしまえば済む話ではありますが、
ここは一手間かけて単体で使える美しいグラフを作る事を考えてみましょう。
とは言っても、Tikz命令を出力するまではほぼ変化なく、set terminal命令をちょっと弄るだけです。

plot2.plt
set terminal tikz standalone #standaloneを追加
set output "graph2.tex"
set xr[-5:5]
set title "テスト出力"
plot sin(x) t "$\\sin(x)$", cos(x) t "$\\cos(x)$", sin(x)+cos(x) t "合成波"

これによって生成されるファイルは以下のようになります。

graph2.tex
\documentclass[10pt]{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}

\usepackage[utf8x]{inputenc}

\usepackage{gnuplot-lua-tikz}
\pagestyle{empty}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{\gpbboxborder}
\begin{document}

\begin{tikzpicture}[gnuplot]
%% generated with GNUPLOT 4.6p1 (Lua 5.1; terminal rev. 99, script rev. 100)
...(以下略)

先程の出力にはなかった、ドキュメントクラスの指定やプリアンブルの記述などが追加されています。
ですがこの設定には2つ問題があります。

  • ドキュメントクラスの問題でこのままでは日本語の処理ができない
  • ページサイズをグラフの大きさに揃えるためにpreviewパッケージを利用しているのですが、これがdvipdfmxと相性が悪く、platex→dvipdfmxで処理しても正常な出力が得られない

これらの問題の解決方法は

の2通りの方法で解決できます。

pdfcropを使う

この場合、previewパッケージまわりの記述をがっつり削除してしまいます。

graph2.tex
\documentclass[10pt,dvipdfmx]{jsarticle} %ドキュメントクラス変更
\usepackage[T1]{fontenc}
\usepackage{textcomp}

\usepackage[utf8x]{inputenc}
\usepackage{lmodern} %せめてLatin Modernを使いたい

\usepackage{gnuplot-lua-tikz}
\pagestyle{empty}
%以下三行を削除
%\usepackage[active,tightpage]{preview}
%\PreviewEnvironment{tikzpicture}
%\setlength\PreviewBorder{\gpbboxborder}
\begin{document}

\begin{tikzpicture}[gnuplot]
%% generated with GNUPLOT 4.6p1 (Lua 5.1; terminal rev. 99, script rev. 100)
...(以下略)

これで後は、platex→dvipdfmxと処理していき、出力されたファイルをpdfcropにかければ完成です。

prdvipdfmx.defを利用する

prdvipdfmx.defは適切な場所に置いているものとします。
この場合、ドキュメントクラスとpreviewパッケージの呼び出しの記述を変えるだけでOKです。

graph2.tex
\documentclass[10pt,dvipdfmx]{jsarticle} %ドキュメントクラス変更
\usepackage[T1]{fontenc}
\usepackage{textcomp}

\usepackage[utf8x]{inputenc}
\usepackage{lmodern} %せめてLatin Modernを使いたい

\usepackage{gnuplot-lua-tikz}
\pagestyle{empty}
\usepackage[active,dvipdfmx,tightpage]{preview} %dvipdfmxオプションを追加
...(以下変更なし)

この後はplatex→dvipdfmxと処理するだけで、グラフ単体のPDFファイルが生成されます。

今回作成したグラフはこちらになります。
(日本語をゴシック体にして、キャプションのサイズを大きくする補正を行っています)

graph3.png

グラフを実線にしたい場合は、set terminal tikz solidとすれば良いです多分。

まとめ

以上のように、ただのグラフにも一手間加えてLaTeXの強力な組版の力を借りる事によって、より美しいグラフが出力できるという事が分かったかと思います。
今回作成したグラフも、最小限にしか手を加えていないので、凝ろうと思えばより見栄えの良いグラフを作る事は可能ですが、グラフはあくまでデータを見せるためのものです。やり過ぎないようにしましょう。

それでは良いLaTeXライフを。