TikZのdatavisualizationライブラリでcsvファイルから簡単な2Dプロットをする

[2016年8月8日追記] **[PGFPlots](http://pgfplots.sourceforge.net/)** というパッケージ(?)の存在を知ったのだが, こっちでやった方が楽かもしれない. その内調べる.

数値計算の結果を論文やスライド用の図にするとき, デザインやらフォントやらを好きに変えたい, と思うことが多い.
各々の数値計算ソフトやグラフ描画ソフトでいじることはできるけど, 慣れとか自由度とかの問題から, TikZ を使いたい.
また, Julia や Matlab や Scilab は配列をcsvファイルとして出力する機能が備わっているので, これを利用したい.
そこで TikZ の (というか PGF の) マニュアルを検索してみると, どうやら **datavisualization** というライブラリを使うと良さそう, ということがわかる.
ここではマニュアルの Data Visualization の章の中から, 自分が今までやってきたこと, これからやりたいことをピックアップしてメモしておく.

しかし, 分量が多いので, 記事を4つに分けた.
それぞれの内容は以下の通りである.

- [1つ目](http://qiita.com/t_kemmochi/items/b9e9de21b77958e71eac): この記事. 基本的なプロットについて.
- [2つ目](http://qiita.com/t_kemmochi/items/4b58995ea14799a48349): 軸の編集について.
- [3つ目](http://qiita.com/t_kemmochi/items/a5a2671e4a893b6ff64b): より細かい装飾について.
- [4つ目](http://qiita.com/t_kemmochi/items/1aeafd5ec3f5f7edc4f2): 応用編. 凝った折れ線グラフを描く.


なお, 2Dプロットしか扱わない. TikZ での3Dプロットはやったことがないのでよくわからない...


# 仮定

この記事では以下の csv ファイルを用いて三角形と四角形をプロットすることにする.
なお, (csvファイルに限らず) 点データの集まりを**データセット**と呼ぶ.

```triangle.csv
1,2
4,2
2,4
1,2
```

```quadrangle.csv
1.5,1
2.5,-1.5
4.5,-0.5
3,2.5
1.5,1
```

可視化するとこんな感じ (これは matplotlib による可視化).
![triqua.png](https://qiita-image-store.s3.amazonaws.com/0/111178/87637f8e-a9b6-b6b3-6a75-d5e2a9374447.png)


以下, 日本語入力することを考えて, (lt)jsarticle クラス + preview パッケージで図を作ることにする.
(別に standalone クラスでもいいと思う.)
Tikz のライブラリの読み込みも含めると, プリアンブルは以下のようになる. 

```latex
\documentclass{ltjsarticle}

\usepackage{tikz}
\usetikzlibrary{datavisualization}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}
...
```

**以後, プリアンブルは省略して, `tikzpitucure` 環境だけ書く.**



# ライブラリの読み込み

すでに上に書いてあるが, TikZ のライブラリの読み込みには, `\usetikzlibrary` コマンドを用いる.

```latex
\usepackage{tikz}
\usetikzlibrary{datavisualization}
```

# とりあえずプロットする

三角形を1つだけプロットするなら, 以下の記述で十分.

```latex
\begin{tikzpicture}
    \datavisualization[
        scientific axes, 
        visualize as line
        ]
        data[headline={x, y}, read from file=triangle.csv];
\end{tikzpicture}
```

出力:

![csv2pdf-2-000001.png](https://qiita-image-store.s3.amazonaws.com/0/111178/3d8f22e5-9fdd-3757-ea7e-74646d873b07.png)


大事な点は,

1. **`\datavisualization` コマンドで描画の情報を記述する**
2. **`data[...]` でcsvファイルを読み込む**

の2点である.
また, **セミコロンの位置に注意**.

それぞれのオプションについて説明する.

## 描画の情報を記述する: `\datavisualization` コマンド

最低限, **軸のスタイル**と**線のスタイル**を指定しないと, 描画されない.

まず, **`scientific axes`** で**軸のスタイル**を記述している. 
他にもいろいろ指定できるようだが, 使うとすれば以下のものくらいだろう.

| オプション        | 軸のスタイル        |
|:-----------------|:-------------------|
|`scientific axes` | 通常の(?)軸         |
|`school book axes`| 中学校で習うような軸 |
|`xy Cartesian`    | 軸を描かない        |


次に, **`visualize as line`** で**線のスタイル**を指定している.
`line` 以外も指定できる.

| オプション   | 線のスタイル           |
|:------------|:----------------------|
|`line`       | 直線で結ぶ             |
|`smooth line`| 曲線で結ぶ             |
|`scatter`    | ×印を打つだけで結ばない |

ただ, 普通は `line` でいいと思う.
点にマーカーを付けて線で結ぶ, ということをしたいときは, TikZ のスタイル指定方法が使えるので, `scatter` ではなくそっちでやれば良い (後述).


## csvファイルを読み込む: `data[...]`

最初の `headline={x, y}` で, データセットにヘッダーを付け加えている.
**数字だけのcsvファイルを使う場合, ヘッダーを付け加えないとエラーになる**っぽいので, ほぼ必須.
詳しいことはマニュアルの Providing Data for a Data Visualization のセクションに書いてあるっぽい.

後ろの **`read from file=` でcsvファイルを指定**する. 
例の如く相対パスしか指定できない模様.


# 2つ以上のデータセットをプロットする

この場合は, **データセットに名前をつける**というのが重要.

```latex
\begin{tikzpicture}
    \datavisualization[
        scientific axes, 
        visualize as line/.list={tri, qua}
        ]
        data[set=tri, headline={x, y}, read from file=triangle.csv]
        data[set=qua, headline={x, y}, read from file=quadrangle.csv];
\end{tikzpicture}
```

出力:
![csv2pdf-2-000002.png](https://qiita-image-store.s3.amazonaws.com/0/111178/46cf0404-bcaa-8ddb-5259-80e897536ac7.png)

前節からの変更点は2ヶ所である.

1. `visualize as line` が **`visualize as line/.list={tri, qua}`** となっている. これによって, **データセットの名前の集合を用意**している.
2. `data[...]` に **`set=tri`** (または `set=qua`) が追加されている. これは**データセットに名前を割り当てている**.

名前は何でもいいっぽい. `/.list={1,2}` とかでも大丈夫.
プロットする**データセットの数だけ名前を用意する**必要がある.

名前をつけるという操作によって, それぞれの線を装飾することができる (次節).
なので, データセットが1つであっても, **常に名前をつけるようにしておく**のが良いと思う. 
(実は, 名前を指定しなかった場合, デフォルトで `line` という名前が付けられるのだが.)


# 線を装飾する

`\datavisualization` コマンドのオプション内で, **`名前={style={...}}`** とすることで, `style={...}` 内でTikZ のスタイル指定方法を使えるようになる.

例えば, 

- 三角形は 赤線, 細線, データ点に×印, ×印は青色
- 四角形は 緑線, 太線, 破線

としたければ, 以下のようにすれば良い.


```latex
\begin{tikzpicture}
    \datavisualization[
        scientific axes, 
        visualize as line/.list={tri, qua}, 
        tri={style={red, thin, mark=x, mark options={color=blue}}},
        qua={style={green, thick, dashed}}
        ]
        data[set=tri, headline={x, y}, read from file=triangle.csv]
        data[set=qua, headline={x, y}, read from file=quadrangle.csv];
\end{tikzpicture}
```

出力:
![csv2pdf-2-000003.png](https://qiita-image-store.s3.amazonaws.com/0/111178/da3de506-64a1-d07e-ede7-bd36ebcea086.png)

## マーカーについて: plotmarks ライブラリ

これは datavisualization ライブラリの話ではないが, 上の三角形のようにマーカー付きのプロットをしたいことは多いので, ついでにまとめておく.

まず, TikZ では以下の3つのマーカーを使うことができる.

| マーカー              | 出力 |
|:---------------------|:----:|
|`*`                   |●     |
|`+`                   |＋    |
|`x` (小文字のエックス) |×     |

**plotmarks ライブラリ**を使うと, 使えるマーカーが増える.
例えば, 次が使えるようになる.


| マーカー              | 出力    |
|:---------------------|:-------:|
|`o` (小文字のオー)     |○        |
|`asterisk`            |＊       |
|`oplus`               |$\oplus$ |
|`otimes`              |$\otimes$|
|`square`              |□        |

詳細は マニュアルの Plot Mark Library のセクションを参照.


# 他の記事へのリンク

冒頭にもあるが, 改めて書いておく.

- [1つ目](http://qiita.com/t_kemmochi/items/b9e9de21b77958e71eac): この記事. 基本的なプロットについて.
- [2つ目](http://qiita.com/t_kemmochi/items/4b58995ea14799a48349): 軸の編集について.
- [3つ目](http://qiita.com/t_kemmochi/items/a5a2671e4a893b6ff64b): より細かい装飾について.
- [4つ目](http://qiita.com/t_kemmochi/items/1aeafd5ec3f5f7edc4f2): 応用編. 凝った折れ線グラフを描く.