2

I have a plot with 63 lines, only some of which I would like legend entries for. The full legend takes up half a page, and using the \ref method does not give me consistency with the surrounding plots. I am using a very hacked and modified version of Jake's auto-legend plot (https://tex.stackexchange.com/a/24023/4621) with some auto coloring and some filled plots for confidence interval.

I have tried this with etoolbox's \ifinlist from a list created with \forcsvlist, but the legend entries that are added have the wrong coloring.

Any ideas?

Without the \ifinlist bits it works perfectly well, but I want to only add legend entries for certain lines(columns/whatever).

Here is the function that partially does the magic:

\newcommand*{\plotFileRainbowCertaintyLegendList}[5]{
  \begin{tikzpicture}
    \begin{axis}[
        %Unboxed,
        %Dates,
        %twocolumn,
        y tick label style={/pgf/number format/fixed},
        xlabel={},
        legend columns = 3,
        legend style={at={(0.5,-0.1)},anchor=north},
        #4
      ]
    %By column number
    \forcsvlist{\listadd\LegendList}{50,52,53,56}
    %By column name
    %\forcsvlist{\listadd\LegendList}{col1Name,col2Name,etc...}

    \pgfplotstableread{#1}\Mod
    \pgfplotstableread{#2}\ModLow
    \pgfplotstableread{#3}\ModHigh


    \def\WaveLow{360}
    \def\WaveHigh{660}

    \pgfplotstablegetcolsof{\Mod}
    \pgfmathtruncatemacro\numberofcols{\pgfplotsretval-1}
    \pgfmathsetmacro{\waveStep}{(\WaveHigh-\WaveLow)/\numberofcols}

      \pgfplotsinvokeforeach{1,...,\numberofcols}{
        \pgfmathparse{\WaveLow+##1*\waveStep}
        \definecolor{Offence##1}{wave}{\pgfmathresult}

          \addplot+[Offence##1!50,opacity=0.01,name path=confLow, mark = none, line width = 0, forget plot,#5] table [y index=##1] \ModLow ;
          \addplot+[Offence##1!50,opacity=0.01,name path=confHigh, mark = none, line width = 0, forget plot,#5] table [y index=##1] \ModHigh ;
          \addplot[Offence##1!70,opacity=0.5, forget plot,#5] fill between[of=confLow and confHigh];

        \pgfplotstablegetcolumnnamebyindex{##1}\of{\Mod}\to{\colname}
        \addplot+[Offence##1,solid,thick,mark=none,#5] table [y index=##1] {\Mod};
        %By column number
        \xifinlist{##1}{\LegendList}{\addlegendentryexpanded{\colname};}{}
      }
        %By column name
        %\xifinlist{\colname}{\LegendList}{\addlegendentryexpanded{\colname};}{}
      %}
    \end{axis}
  \end{tikzpicture}
} 

Which produces output like:

Example output of the function above, without selective legend entries

SpmP
  • 1,201

1 Answers1

4

This can be done. For details please have a look at the comments in the code.

% used PGFPlots v1.14
%
% these are just some dummy data files
\begin{filecontents*}{low.txt}
x y1 y2 y3 y4 y5 y6 y7 y8 y9
1 13 23 33 43 53 63 73 83 93
9 13 23 33 43 53 63 73 83 93
\end{filecontents*}
\begin{filecontents*}{med.txt}
x y1 y2 y3 y4 y5 y6 y7 y8 y9
1 15 25 35 45 55 65 75 85 95
9 15 25 35 45 55 65 75 85 95
\end{filecontents*}
\begin{filecontents*}{high.txt}
x y1 y2 y3 y4 y5 y6 y7 y8 y9
1 18 28 38 48 58 68 78 88 98
9 18 28 38 48 58 68 78 88 98
\end{filecontents*}
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \usetikzlibrary{
        pgfplots.fillbetween,
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            no markers,
        ]
                \pgfplotstableread{med.txt}\Mod
                \pgfplotstableread{low.txt}\ModLow
                \pgfplotstableread{high.txt}\ModHigh

                \def\WaveLow{360}
                \def\WaveHigh{660}
            \pgfplotstablegetcolsof{\Mod}
            \pgfmathtruncatemacro\numberofcols{\pgfplotsretval-1}
            \pgfmathsetmacro{\waveStep}{(\WaveHigh-\WaveLow)/\numberofcols}

%            % this was the old command ...
%            \pgfplotsinvokeforeach{1,...,\numberofcols}{
            % ... which is replaced by a list that only contains the column
            % numbers for which the legend entry should be shown
            \pgfplotsinvokeforeach{4,8}{
                    \pgfmathparse{\WaveLow+#1*\waveStep}
                    \definecolor{Offence#1}{wave}{\pgfmathresult}

                \addplot+ [Offence#1!50,opacity=0.01,forget plot,name path=confLow]
                    table [y index=#1] \ModLow;
                \addplot+ [Offence#1!50,opacity=0.01,forget plot,name path=confHigh]
                    table [y index=#1] \ModHigh;
                \addplot  [Offence#1!70,opacity=0.50,forget plot]
                    fill between [of=confLow and confHigh];

                    \pgfplotstablegetcolumnnamebyindex{#1}\of{\Mod}\to{\colname}
                \addplot+ [Offence#1,solid,thick]
                    table [y index=#1] {\Mod};
                    \addlegendentryexpanded{\colname};
            }

            % then provide a second one the previous commands but this time only
            % with the elements that should not show up in the legend
            % (I hope you get the idea of how to do it with this example)
            \pgfplotsinvokeforeach{1,...,3,5,6,...,7,\numberofcols}{
                    \pgfmathparse{\WaveLow+#1*\waveStep}
                    \definecolor{Offence#1}{wave}{\pgfmathresult}

                \addplot+ [Offence#1!50,opacity=0.01,forget plot,name path=confLow]
                    table [y index=#1] \ModLow;
                \addplot+ [Offence#1!50,opacity=0.01,forget plot,name path=confHigh]
                    table [y index=#1] \ModHigh;
                \addplot  [Offence#1!70,opacity=0.50,forget plot]
                    fill between [of=confLow and confHigh];

                    \pgfplotstablegetcolumnnamebyindex{#1}\of{\Mod}\to{\colname}
                \addplot+ [Offence#1,solid,thick]
                    table [y index=#1] {\Mod};
%                    % and of course this time don't provide the legend command
%                    \addlegendentryexpanded{\colname};
            }
        \end{axis}
    \end{tikzpicture}
\end{document}

image showing the result of above code

Stefan Pinnow
  • 29,535
  • Why the negative rating? By the example output this seems to answer the question... now to dredge up that old thesis and see if this helps 8) – SpmP Mar 01 '17 at 06:02
  • I don't know either. But I got several other negative voting on some of my answers that I provided two days ago. So it seems someone doesn't like me or my answers ... :-/ So please let me know if this solution works for you. – Stefan Pinnow Mar 01 '17 at 15:21
  • @SpmP, did you have the time to find out if my answer solves your question? If so, then you could think of accepting it (by clicking on the checkmark ✓). – Stefan Pinnow Mar 29 '17 at 12:38