CSV などのデータファイルを TeX のみでグラフ化し，PDF で保存する

# なぜ TeX を使いたいか
* 論文等を TeX で書くとき：
    * 図で用いるフォントも TeX 由来のものに統一したい．
    * 文中のフォントサイズと図のフォントサイズを無理なく合わせたい．
    * 元データに修正が入るたびに図を作り直すのが面倒なので，コマンド一発で再生成できるようにしたい．

上記の多くは `Python` の `matplotlib` でも実現可能であるが，`PGF/TikZ` のほうが柔軟性が高いと考えたため，しばらくはこちらで運用することにする．

# 筆者の環境
* macOS Big Sur Version 11.5
* TeX Live 2020 (GUI は特に不要です)

# データファイル
次のような CSV ファイルのデータをグラフ化してみます．

```shell:test.csv
x1, x2, x3 # ヘッダはあってもなくても構わない
1, 1, 1
2, 4, 8
3, 9, 27
4, 16, 64
5, 25, 125
```

# TeX ソース

```tex
\documentclass[dvipdfmx,tikz,border=10pt]{standalone}
% tikz       : 指定しなければ PDF 2ページ目に白紙が入ってしまう．                                                                                                                                                                                                               
% border     : 余白に相当．指定なしではグラフがはみ出ることがある．                                                                                                                                                                                                             

\usepackage{pgfplots}

\pgfplotstableread[  % CSV の読み込み                                                                                                                                                                                                                                           
  col sep=comma,     % セパレータ                                                                                                                                                                                                                                               
  comment chars={\#} % コメント行の先頭文字                                                                                                                                                                                                                                     
]{test.csv}\testcsv

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      xmin=0, xmax=6,
      xlabel={$x$},         % x 軸のラベル，もちろん math モードで書けます
      ylabel={$y$},         % y 軸のラベル
      width=400pt, 
      height=200pt,
      grid=both,            % 主グリッド，副グリッド，共に表示                                                                                                                                                                                                                  
      grid style={gray!20}, % グリッド線のスタイル                                                                                                                                                                                                                              
      minor tick num = 1,   % 副目盛（グリッド）の本数                                                                                                                                                                                                                          
      xtick distance = 1    % x 目盛の間隔                                                                                                                                                                                                                                      
    ]
    \addplot table [
      x index=0, % x 座標として用いるデータのインデックス                                                                                                                                                                                                                       
      y index=1  % y 座標として用いるデータのインデックス                                                                                                                                                                                                                       
    ] \testcsv;
    \addplot table [
      x = x1, % インデックスの代わりにヘッダを利用                                                                                                                                                                                                                              
      y = x3
    ] \testcsv;
  \end{axis}
\end{tikzpicture}
\end{document}
```

* ファイルの先頭行にヘッダを指定してある場合，`x index=0` は `x = x1` などの形に置き換えることができます．
* `col sep` としては，`comma` の他に `space` や `tab` など色々なセパレータを指定できます．
* `PGF/TikZ` の記法ではコマンド文末に `;` がつくことをお忘れなく．

# 出力結果
* エンジンは何でも良いですが，筆者は `latexmk` （中身は `platex + dvipdfmx`）を用いています．

![Screen Shot 2021-08-25 at 20.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467925/edf3c0da-4384-9807-e760-2d961a1c6295.png)

* 図を論文等に挿入する際には，サイズ変更やスケーリングなどのオプション（`width=.75\textwidth, scale=2.0` など）を用いずに，そのまま `\includegraphics{test.pdf}` などとしましょう．`documentclass` のフォントサイズが同じであれば，図のフォントと本文フォントが完全に一致します．
* 本稿では紹介しませんが，`node` や `pin` などを用いれば，柔軟なデコレーションが可能になります．