2

I am constructing a groupplot with a common legend placed in a node under the plot. An MWE that recreates my problem is below.

\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usetikzlibrary{pgfplots.groupplots}

\pgfplotsset{compat = 1.12}

\begin{document}
    \centering
    \begin{figure}
    \begin{tikzpicture}{fig3}
        \begin{groupplot}[
            legend columns=4,
            legend entries={{\tiny Hold All},{\tiny Come and Go},{\tiny Random},{\tiny +Resources},{\tiny ++Resources},{\tiny ++ResourcesPT},{\tiny ++ResourcesSM},{\tiny ++ResourcesBM}},
            legend to name=Fig3Legend,
            group style={
                group name = fig3_plots,
                group size=3 by 1,
                xlabels at=edge bottom,
                ylabels at=edge left
            },
            width=\textwidth,
            legend style={draw=none},
            xlabel = {\footnotesize $\alpha$},
            ylabel = {\footnotesize Avg Portfolio Value},
        ]
        \nextgroupplot[title={\scriptsize +Resources},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0,
        xtick={1000,2000,3000,4000}]
            \addplot+[black, mark=o,line join=round, mark repeat=50] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[black, mark=x,line join=round, mark repeat=50] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[black, mark=|,line join=round, mark repeat=50] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[black, mark=square,line join=round, mark repeat=50] table[col sep=comma, y=Plus, x=Alpha]{ElicitedFixedAlpha.csv};
        \nextgroupplot[title={\scriptsize ++Resources (Empirical CDF)},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0]
            \addplot+[black, mark=o,line join=round, mark repeat=50] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=x,line join=round, mark repeat=50] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=|,line join=round, mark repeat=50] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=square,line join=round, mark repeat=50] table[col sep=comma, y=PlusPlus, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
        \nextgroupplot[title={\scriptsize ++Resources (Elicited CDFs)},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0]
            \addplot+[black, mark=o,line join=round, mark repeat=50] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=x,line join=round, mark repeat=50] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=|,line join=round, mark repeat=50] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=triangle,line join=round, mark repeat=50] table[col sep=comma, y=PlusPlusPT, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=square,line join=round, mark repeat=50] table[col sep=comma, y=PlusPlusSM, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[black, mark=asterisk,line join=round, mark repeat=50] table[col sep=comma, y=PlusPlusBM, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
        \end{groupplot}
        \node (fig3_Legend) at ($(fig3_plots c2r1.center)-(0,2.5cm)$){\ref{Fig3Legend}};
    \end{tikzpicture}
    \caption{Fixed $\alpha$ Values}
    \label{FixedAlphas}
\end{figure}
\end{document}

The data is available at

ElicitedFixedAlpha.txt

ElicitedFixedAlphaPlusPlus.txt

It produces the following output

enter image description here

Which is fine, except that it's missing the last two legend entries.

In the groupplot definition I have

legend entries={{\tiny Hold All},{\tiny Come and Go},{\tiny Random},{\tiny +Resources},{\tiny ++Resources},{\tiny ++ResourcesPT},{\tiny ++ResourcesSM},{\tiny ++ResourcesBM}},

But as you can see in the image, the last two aren't there. The corresponding data series are in the chart...hard to see as they all land on top of each other in the rightmost chart, but they're there. So why don't the legend entries show up?

  • Er... why didn't you make it an MWE? That would obviously be more useful ;). – cfr Aug 2 '15 at 0:41
  • I was a) hoping it would be something simple and b) trying to avoid the hassle of providing all the data that goes into them. I'll try to modify it tonight....fighting another problem with a funky surface plot (which will probably warrant its own question later) – jerH Aug 2 '15 at 2:29
3

In the .log file you will find the warnings

LaTeX Warning: Label `Fig3Legend' multiply defined.

LaTeX Warning: Label `Fig3Legend' multiply defined.

What this means is that the Fig3Legend label is applied to all three groupplots, and therefore the \ref will point to only the last of these, the last groupplot. As that only has six plots, you get six entries in the legend. One workaround is shown below. I first define eight styles for the plots (for convenience, this isn't strictly necessary), and in the last groupplot I add two \addlegendimage, which is used to add additional entries in the legend.

Note that I also altered the style of +Resources and ++Resources slightly, so there less chance of confusion. You had three lines with the same style.

enter image description here

\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usetikzlibrary{pgfplots.groupplots}

\pgfplotsset{compat = 1.12}

\begin{document}
    \begin{tikzpicture}[
            HA/.style={black, mark=o,line join=round, mark repeat=50},
            CAG/.style={black, mark=x,line join=round, mark repeat=50},
            Rnd/.style={black, mark=|,line join=round, mark repeat=50},
            P/.style={black, densely dashed, mark=square,line join=round, mark repeat=50},
            PP/.style={black, thick, mark=square,line join=round, mark repeat=50},
            PPPT/.style={black, mark=triangle,line join=round, mark repeat=50},
            PPSM/.style={black, mark=square,line join=round, mark repeat=50},
            PPBM/.style={black, mark=asterisk,line join=round, mark repeat=50}]

        \begin{groupplot}[
            legend columns=4,
            legend style={nodes={font=\tiny}},
            legend entries={Hold All,Come and Go,Random,+Resources,++Resources,++ResourcesPT,++ResourcesSM,++ResourcesBM},
            legend to name=Fig3Legend,
            group style={
                group name = fig3_plots,
                group size=3 by 1,
                xlabels at=edge bottom,
                ylabels at=edge left
            },
            width=\textwidth,
            legend style={draw=none},
            xlabel = {\footnotesize $\alpha$},
            ylabel = {\footnotesize Avg Portfolio Value},
        ]
        \nextgroupplot[title={\scriptsize +Resources},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0,
        xtick={1000,2000,3000,4000}]
            \addplot+[HA] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[CAG] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[Rnd] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlpha.csv};
            \addplot+[P] table[col sep=comma, y=Plus, x=Alpha]{ElicitedFixedAlpha.csv};
        \nextgroupplot[title={\scriptsize ++Resources (Empirical CDF)},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0]
            \addplot+[HA] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[CAG] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[Rnd] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[PP] table[col sep=comma, y=PlusPlus, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
        \nextgroupplot[title={\scriptsize ++Resources (Elicited CDFs)},
            y tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
      },
            footnotesize,
            x tick label style={
                font=\tiny,
        /pgf/number format/.cd,
            fixed,
            fixed zerofill,
            precision=0,
        /tikz/.cd
    },
        ymin=0]
            \addplot+[HA] table[col sep=comma, y=HoldAll, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[CAG] table[col sep=comma, y=ComeAndGo, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[Rnd] table[col sep=comma, y=Random, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addlegendimage{P}
            \addlegendimage{PP}
            \addplot+[PPPT] table[col sep=comma, y=PlusPlusPT, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[PPSM] table[col sep=comma, y=PlusPlusSM, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
            \addplot+[PPBM] table[col sep=comma, y=PlusPlusBM, x=Alpha]{ElicitedFixedAlphaPlusPlus.csv};
        \end{groupplot}
        \node (fig3_Legend) at ($(fig3_plots c2r1.center)-(0,2.5cm)$){\ref{Fig3Legend}};
    \end{tikzpicture}

\end{document}
  • Is there any reason this shouldn't work with an externalized picture? If I change the {tikzpicture} to {extikzpicture} it no longer builds. When I check the log file for the external picture job it says "! Package pgfkeys Error: I do not know the key '/tikz/HA' and I am going to ignore it. Perhaps you misspelled it." And no image....I'll keep poking, but if this one is a simple issue then thanks in advance! – jerH Aug 3 '15 at 3:31
  • Disregard...got it. Added a pgfplotsset inside the extikzpicture environment and it worked fine. Thanks! – jerH Aug 3 '15 at 3:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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