I use addplot to plot a data set which has nan values.
The data file contains 5 columns.
First column is the x-axis (time), the second and fourth is the wavelenght (same element, but 2 measurements) with its corresponding errors in the third and fifth column.
I can plot it with errorbars, but the last addplot does not work.
I want to make different y expr for different cases (value is NaN or not), because otherwise pgfplots just skips the "fit" if there's a "NaN".
Here is a minimal example:
\documentclass[11pt]{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\usepackage{verbatim}
\begin{filecontents*}{data.dat}
time w1 e1 w2 e2
1 3019 40 nan nan
2 3045 34 nan nan
3 3100 50 3104 24
4 3500 13 3498 90
5 3800 90 3803 12
6 nan nan 3980 43
7 nan nan 3985 80
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis} [
compat=newest,
y tick label style={/pgf/number format/1000 sep=},
ymin=2900,
ymax=4400]
\addplot [only marks, mark=+, color=red, thick,
error bars/.cd,
y explicit,
y dir=both
] table [x index=0, y index=1, y error index=2] {data.dat};
\addlegendentry{measurement 1}
\addplot [only marks, mark=+, color=green, thick,
error bars/.cd,
y explicit,
y dir=both
] table [x index=0, y index=3,y error index=4] {data.dat};
\addlegendentry{measurement 2}
\begin{comment}
\addplot [color=blue, thick
] table [x index=0,
%this is the part I have no idea how to make it work:
if (index 1 and index 3 are not NaN):
y expr= (index 1 + index 3)/2
y error expr= max{index 2, index 4}
else if (index 3 = NaN):
y index =1
y error index=2
else if (index 1 = NaN):
y index =3
y error index=4
] {data.dat};
\addlegendentry{fit}
\end{comment}
\end{axis}
\end{tikzpicture}
\end{document}
I hope it's obvious what I am trying to do. I am looking forward for your comments and thanking you in anticipation!
Best Answer
You can define a customized math "function" which relies on the fact that it is evaluated while the input table is read. In other words, it is only valid within your context.
It uses the FPU of pgf which is used by pgfplots, and, in particular, its method
\pgfmathfloatparsenumber
. A float in pgf has "flags" which is an integer with the meaningconsequently, we can call
\pgfmathfloatparsenumber
and use\pgfmathfloatgetflagstomacro
to access the flag. Integer comparisons can be done by means of\ifnum<int>=<int> \else \fi
.Defining two functions, one for Y and one for the error bar results in
note that I have eliminated the two other
\addplot
statements.The
\let\<macro>=<othermacro>
copies<othermacro>
to<macro>
. The constructions\ifnum<\macro>=3 %
compares two integers. Note the trailing space after3
, it is important to tell TeX that it should stop to search for further numeric literals. It will be omitted from the output.