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