Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I am trying to use a relative value (percentage) extracted of a table to define the color of several 2D plots like this:

Sample plot with different colors

At the moment I'm using addplot[mesh] together with a self defined colormap but I'd rather prefer a different way as mesh doesn't work with some modifications I want to do later.

\addplot[mesh,point meta=\yValRel,point meta min={0}, point meta max={100}] table [x=x\datasetNumber, y=F\datasetNumber] {\dataXF} ;

I would prefer something like this, where the value read from the table is directly used as an relative operator for the colormapping:

\addplot[color=orange! \yValRel !blue] table [x=x\rowNumber, y=F\rowNumber] {\dataXF};

This command works with pre-defined variables, but \pgfmathtruncatemacro{\yValRel}{\pgfplotsretval} doesn't read the value during the loop (when printing the number with node at (axis:cs 3,\yValRel) {\yValRel}; it prints always the same number).

Has anyone a proper solution? Below you find a working minimum example. Thanks!

\documentclass{standalone}

\usepackage{pgfplots,pgfplotstable}
\usetikzlibrary{calc}

\pgfplotsset{colormap={blueorange}{color(0)=(blue); color(100)=(orange);}}
\pgfplotstableread{
    x0  F0  x1  F1  x2  F2
    1   10  1   10  1   40
    2   20  2.5 15  1.5 30
    3   30  3.5 25  1.8 20
    4   40  4   40  4.8 15
    5   50  5   45  5   10
}\dataXF    
\pgfplotstableread{
    0   40  80
}\dataY

\begin{document}
\begin{tikzpicture} 
\begin{axis}[colormap name=blueorange]

\pgfplotsinvokeforeach{2,...,0}{
    \pgfmathtruncatemacro{\datasetNumber}{#1}

    \pgfplotstablegetelem{0}{[index] \datasetNumber}\of\dataY
    \pgfmathtruncatemacro{\yValRel}{\pgfplotsretval}

    %\addplot[color=orange! \yValRel !blue] table [x=x\rowNumber, y=F\rowNumber] {\dataXF};
    \addplot[mesh,point meta=\yValRel,point meta min={0}, point meta max={100}] table [x=x\datasetNumber, y=F\datasetNumber] {\dataXF} ;
}
\end{axis}
\end{tikzpicture}
\end{document}
share|improve this question

1 Answer 1

up vote 5 down vote accepted

The \pgfplotstablegetelem and \addplot commands are executed at different times (even though they're both within \pgfplotsinvokeforeach), so the value of \yValRel is not updated for each plot. You can wrap your code into a .code key that you put in your \addplot options, which makes sure that the commands get executed at the right time.

For example, you could write a style

\pgfplotsset{
    make value available/.code args={#1 of #2}{
        \pgfplotstablegetelem{0}{[index] #1}\of#2
        \pgfmathtruncatemacro{\yValRel}{\pgfplotsretval}
    }
}

which you then call using

\addplot[make value available=#1 of \dataY,color=orange!\yValRel!blue] ...

\documentclass[border=5mm]{standalone}

\usepackage{pgfplots,pgfplotstable}
\usetikzlibrary{calc}

\pgfplotsset{
    make value available/.code args={#1 of #2}{
        \pgfplotstablegetelem{0}{[index] #1}\of#2
        \pgfmathtruncatemacro{\yValRel}{\pgfplotsretval}
    }
}
\pgfplotstableread{
    x0  F0  x1  F1  x2  F2
    1   10  1   10  1   40
    2   20  2.5 15  1.5 30
    3   30  3.5 25  1.8 20
    4   40  4   40  4.8 15
    5   50  5   45  5   10
}\dataXF    
\pgfplotstableread{
    0   40  80
}\dataY

\begin{document}
\begin{tikzpicture} 
\begin{axis}[colormap name=blueorange]

\pgfplotsinvokeforeach{2,...,0}{
    \pgfmathtruncatemacro{\datasetNumber}{#1}

    \addplot[make value available=#1 of \dataY,color=orange!\yValRel!blue] table [x=x\datasetNumber, y=F\datasetNumber] {\dataXF};
}
\end{axis}
\end{tikzpicture}
\end{document}
share|improve this answer
    
thanks heaps! is it possible not to use make value available=#1 but make value available=\somevariable without having the problem of different execution levels as well? –  kromuchi Jun 14 '12 at 11:47
    
Hm, I can't see a straightforward solution. Probably best to post a new question, Ryan Reich might be able to help out with that. –  Jake Jun 14 '12 at 12:09

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.