
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 \ref
mé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 etoolbox
uma \ifinlist
lista criada com \forcsvlist
, mas as entradas da legenda adicionadas têm a coloração errada.
Alguma ideia?
Sem os \ifinlist
bits 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:
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}