Adicione seletivamente entradas de legenda para plotar em CSV grande

Adicione seletivamente entradas de legenda para plotar em CSV grande

Eu tenho um enredo com 63 linhas, apenas algumas das quais eu gostaria de ver legendas. A legenda completa ocupa meia página e o uso do \refmétodo não me dá consistência com as parcelas ao redor. Estou usando ummuitoversão hackeada e modificada do enredo de legenda automática de Jake (https://tex.stackexchange.com/a/24023/4621) com alguma coloração automática e alguns gráficos preenchidos para intervalo de confiança.

Eu tentei isso com etoolboxuma \ifinlistlista criada com \forcsvlist, mas as entradas da legenda adicionadas têm a coloração errada.

Alguma ideia?

Sem os \ifinlistbits funciona perfeitamente bem, mas quero adicionar apenas entradas de legenda para determinadas linhas (colunas/qualquer).

Aqui está a função que parcialmente faz a mágica:

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

O que produz resultados como:

Exemplo de saída da função acima, sem entradas de legenda seletivas

Responder1

Isto pode ser feito. Para obter detalhes, dê uma olhada nos comentários no código.

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

imagem mostrando o resultado do código acima

informação relacionada