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}

出力

f:id:Asat:20180401234758p:plain:w300

解説

\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}

出力

f:id:Asat:20180401234507p:plain:w400

解説

おわかりいただけただろうか.

\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