pgfplotsで元の値を加工してプロットする
pgfplotsでは, 表のデータをそのままプロットするだけでなく数値的に加工してプロットできる.
ただ, 処理の正確さとか私はよく把握していないのできちんとした文書には微妙かも.
pgfplotsの簡単な説明は前回記事に.
asat.hatenablog.com
例
ソース
表
a | b |
---|---|
0 | 3 |
1 | 2 |
2 | 1 |
document
環境内
\pgfplotstableread{ a b 0 3 1 2 2 1 }{\mydata} \begin{tikzpicture} \begin{axis} \addplot table [x=a, y=b]{\mydata}; %b vs. a \addplot table [x=a, y expr=\thisrow{b}/2]{\mydata}; %b/2 vs. a \addplot table [x=a, y expr=\thisrow{b}^2]{\mydata}; %b^2 vs. a \legend{$y$,$y/2$,$y^2$}; \end{axis} \end{tikzpicture}
出力
解説
\addplot
の軸指定の際に
y expr={計算式}
を使えば,
データを元に計算式
でいじった結果をプロットできる.
x軸をいじるならx expr=
を使う.
書き方は例に示した感じで.
計算式
内での列の参照は
\thisrow{列名}
または
\thisrowno{列番号}
で行う.
元データに抜けがあるとおかしくなる例
a | b |
---|---|
0 | 1 |
1 | 2 |
2 | |
3 | 4 |
4 | 5 |
のように抜けがあるデータでは,
空白セルをnan
に置き換えて空データであることを明記すると安全.
nan
がないと,
x expr
,
y expr
使用時におかしな結果になる.
ソース
col sep=...
で空白文字以外を列区切りに設定すれば,
空白セルを表現できるようになる.
例えば上の表をcomma
区切り,
つまりCSVにすると,
a,b 0,1 1,2 2,, 3,4 4,5
となる.
これをふまえて, 次のソースと結果をご覧頂きたい.
document
環境内
\pgfplotstableread[col sep=comma]{ a,b,B 0,1,1 1,2,2 2,,nan 3,4,4 4,5,5 }{\mydata} \begin{tikzpicture} \begin{axis} [ table/col sep=comma, legend pos=outer north east, ] \addplot table [x=a,y=b]{\mydata}; %b vs. a \addplot table [x=a,y expr=\thisrow{b}*.9]{\mydata}; %b*0.9 vs. a \addplot table [x=a,y expr=\thisrow{B}*.5]{\mydata}; %B*0.5 vs. a \legend {空白ありそのまま,空白ありを0.9倍,空白をnanにして0.5倍}; \end{axis} \end{tikzpicture}
出力
解説
おわかりいただけただろうか.
\pgfplotsread
の際に,
上の表のb列と似たような列を3列目(名前はBとした)に加えている.
違いは,
2列目の空白セルが3列目ではnan
という文字列になっているだけ.
\addplot table [x=a,y=b]{\mydata};
でaに対してbをそのままプロットすると, 空白セルは無視される.
しかし
\addplot table [x=a,y expr=\thisrow{b}*.9]{\mydata};
のような数値処理では, 空白セルの値が1として扱われてしまう模様.
データがないことを表すnan
を明記することでこれを回避できる(3つめのプロット).
参照
- pgfplots
- 4.3.4 Mathematical Expressions And File Data
pgfplotsで外部ファイルのデータをプロットする
LaTeXで卒業論文を書いた際にpgfplotsというパッケージを利用した.
忘れてしまうので使い方をまとめる.
pgfplotsとは
pgfplotsは,
TeXの描画パッケージ:TikZ/pgfを利用してTeXにグラフを描画するパッケージ.
gnuplotを使う場合と違ってTeXソース内部で表の設定ができる.
詳しくは,
ターミナルでtexdoc pgfplots
としてドキュメントを参照のこと.
使い方が網羅されている.
表面的なことしかわかっていないが, 使った部分をまとめる.
使ってみる
ソース
\documentclass[dvipdfmx]{standalone} \usepackage{pgfplots} \pgfplotsset{compat=1.15} \begin{document} \begin{tikzpicture} \begin{axis} \addplot {x^2}; \addplot {x+10}; \end{axis} \end{tikzpicture} \end{document}
出力
解説
\documentclass[dvipdfmx]{standalone}
dvipdfmx
と明示しないとうまく描画されなかった.
\pgfplotsset{compat=1.15}
\pgfplotsset
でpgfplotsの全体的な設定をする.
ここではバージョンのみ設定.
\begin{tikzpicture} \begin{axis} \addplot {x^2}; \addplot {x+10}; \end{axis} \end{tikzpicture}
TikZのtikzpicture
環境の中にaxis
環境を置く.
これで2軸グラフが1つ作られる.
両対数グラフならaxis
のかわりにloglogaxis
.
片対数はsemilogyaxis
かsemilogxaxis
.
\addplot {プロット内容};
で1組のデータをプロット.
\addplot
を並べれば,
1つのグラフに複数のデータをプロットできる.
上の場合特に設定していないので, 適当なサンプル数と定義域で
がプロットされる.
表データをプロット
これ以降はdocument
環境内部のソースのみ示す.
ソース
\begin{tikzpicture} \begin{axis} \addplot table { 0 1 1 2 2 1 3 2 }; \end{axis} \end{tikzpicture}
出力
解説
\addplot
のあとにtable
をつけると,
{}
の中に書いた表のデータをプロットできる.
デフォルトでは, 列区切りは1つ以上のタブまたはスペース, 行区切りは改行.
なにも設定しなければ, 表の1列目がx軸, 2列目がy軸になる.
最後の;
忘れに注意.
外部データをプロット
{}
の中身を別ファイル(./data.dat
とか)に保存すれば,
\addplot table {data.dat};
で上と同じ結果になる.
複数のデータを1つのファイルにまとめておいて,
この方法でそれぞれプロットすると便利.
つまり,
ソース
表
data1 | data2 | data3 | data4 |
---|---|---|---|
0 | 50 | 50 | 60 |
2 | 40 | 45 | 55 |
4 | 30 | 40 | 50 |
6 | 20 | 35 | 45 |
data.dat
data1 data2 data3 data4 0 50 50 60 2 40 45 55 4 30 40 50 6 20 35 45
document
環境内
\begin{tikzpicture} \begin{axis} \addplot table [x=data1, y=data2] {data.dat}; \addplot table [x=data1, y=data3] {data.dat}; \addplot table [x=data1, y=data4] {data.dat}; \end{axis} \end{tikzpicture}
出力
解説
\addplot [設定] {...};
で各プロットの設定がいじれる.
設定どうしは,
で区切る.
data.dat
には2列以上のデータがあるので,
各プロットのx軸,
y軸に使う列を指定する必要がある.
1行目に列の名前がある場合は,
その名前を
[x=data1, y=data2]
のように指定.
列番号で指定するなら,
[x index=0, y index=1]
で同じ結果になる.
外部ファイルから読み込む別の方法
pgfplotstable
というパッケージを使う.
プリアンブルで
\usepackage{pgfplotstable}
とした上で
\pgfplotstableread{data.dat}{\mydata}
であらかじめdata.dat
を読み込んでおけば,
\addplot table [...] {\mydata}
でdata.dat
からプロットできる.
\mydata
の部分は好きに名前をつければいい.
体裁を整える
ソース
\begin{tikzpicture} \begin{axis} [ %以下グラフの設定 title={サンプル}, %タイトル xlabel=$x$, ylabel=$y$, %軸タイトル xmin=0, xmax=6, %x軸のminとmax xtick distance=2, %x軸刻み幅 only marks, %線なし legend pos=outer north east, %凡例の位置 yticklabel style={ %y軸目盛のフォーマット /pgf/number format/.cd, fixed, %固定小数点形式 zerofill, %ゼロを削らない precision=1, %小数点以下1ケタ }, ] \addplot+[mark=o] table [x=data1, y=data2,] {data.dat}; \addplot table [x=data1, y=data3,] {data.dat}; \addplot table [x=data1, y=data4,] {data.dat}; \legend{$y_1$, $y_2$, $y_3$}; \end{axis} \end{tikzpicture}
出力
解説
\begin{axis} [設定]
でタイトルなどを設定.
yticklabel style={...}
でy軸目盛のフォーマットを変えている.
中身についてはTikZ/pgfまたはpgfplotstableのドキュメントを参照.
詳しくはpgfplotstableの記事でまとめる予定.
区切りの/
や.cd
の意味については別記事にメモを書く予定.
プロットのスタイル
各プロットのスタイル(点種や色など)は,
cycle list
という用意されたスタイル群から自動的に順番に割り振られる.
例えば
\begin{axis} [cycle list name=black white]
とすればモノクロのリストが適用される.
デフォルトのcolor
の他にexotic
やmark list
がある.
点の種類だけ変更して他の設定はcycle list
から引き継ぎたい,
というような場合は,
\addplot+[mark=o] ...
などとする.
+
がないと,
指定していないスタイルはリセットされてしまう.
凡例
\legend{プロット名1,プロット名2,...};
で順番に凡例を指定.
個別に設定したい場合は
\addplot [...] {...}; \addlegendentry{プロット名};
とする.
凡例の場所は
legend pos=...
で設定.
south west|south east|north west|north east|outer north east
の中から指定できる.
外部ファイルにCSVを使う場合
CSV:Comma Separaded Valuesを使う場合は
\addplot
の設定でcol sep=comma
とする.
この場合プロットごとでの設定となる.
グラフ全体で設定するなら,
axis
環境の設定でtable/col sep=comma
とする.
文書全体でなら\pgfplotsset{table/col sep=comma}
参照
- pgf
- 値のフォーマット : 92 Number Printing
- pgfplots
- スタイル : 4.7 Markers, Linestyles, (Background) Colors and Colormaps
- 軸タイトル, 凡例など : 4.9 Axis Descriptions
- pgfplotstable
- 値のフォーマット : 2.7 Number Formatting Options
- 軸目盛のフォーマット