PGFPlots: alinear la leyenda exterior con las subfiguras vecinas

PGFPlots: alinear la leyenda exterior con las subfiguras vecinas

Estoy usando la biblioteca pgfplotswith para mis gráficos y debo usar el paquete por motivos de cumplimiento.tikzexternalsubfigure

Como pueden ver en el mwe a continuación (parte "Intento 1"), dentro de un figure*entorno (que debo usar) coloco dos pequeñas subfiguras, y me gustaría que la leyenda (común a ambas figuras) estuviera entre ellas, posiblemente en media altura. Sin embargo, aunque probé varias especificaciones de posición de la leyenda, no importa lo que haga, la leyenda no se mueve ni un solo milímetro.

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[pdftex]{graphicx}
\graphicspath{{./img/}}
\DeclareGraphicsExtensions{.pdf}
\usepackage{subfigure}
\usepackage{pgfplots}
\usetikzlibrary{external}
\tikzexternalize
\tikzsetexternalprefix{tikzpics/}
\pgfplotsset{compat=newest, every mark/.append style={mark size=1pt, mark line=solid}}
\begin{document}

%%%%%%%%% Attempt 1

\begin{figure*}[t!]
\centering
\subfigure[First]{
\begin{tikzpicture}
    \begin{axis}[width=0.4\textwidth,xlabel={X axis}, ylabel={Y axis},]
        \addplot [blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}] coordinates {(-0.5,-1) (1,1)};
        \addplot [green, mark=*, ultra thick] coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot [red, mark=square*, dotted, ultra thick] coordinates {(-0.5,-1.1) (1,0.9)};
    \end{axis}
\end{tikzpicture}}\hfil
\subfigure{
\begin{tikzpicture}
\begin{axis}[width=0.2\textwidth, height=0.2\textwidth, hide axis, xmin=0, xmax=10, ymin=0, ymax=0.2,legend columns=1,
            legend style={draw=white!15!black,legend cell align=left, at={(0.5,0.5)}},]
    \addlegendimage{blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}}
    \addlegendentry{Trace 1}
    \addlegendimage{green, mark=*, ultra thick}
    \addlegendentry{Trace 2}
    \addlegendimage{red, mark=square*, dotted, ultra thick, mark options={solid,scale=1.5}}
    \addlegendentry{Trace 3}
\end{axis}
\end{tikzpicture}}\hfil
\subfigure[Second]{
\begin{tikzpicture}
    \begin{axis}[width=0.4\textwidth,xlabel={X axis}, ylabel={Y axis},]
        \addplot [blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}] coordinates {(-0.5,-1) (1,1)};
        \addplot [green, mark=*, ultra thick] coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot [red, mark=square*, dotted, ultra thick] coordinates {(-0.5,-1.1) (1,0.9)};
    \end{axis}
\end{tikzpicture}}
\caption{Caption.}
\end{figure*}

%%%%%%%%% Attempt 2

\begin{figure*}[t!]
\centering
\subfigure[First]{
\begin{tikzpicture}
    \begin{axis}[width=0.4\textwidth,xlabel={X axis}, ylabel={Y axis}, legend style={overlay, at={(1.2,0.5)},anchor={north}}]
        \addplot [blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}] coordinates {(-0.5,-1) (1,1)};
        \addplot [green, mark=*, ultra thick] coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot [red, mark=square*, dotted, ultra thick] coordinates {(-0.5,-1.1) (1,0.9)};
        \legend{Trace 1, Trace 2, Trace 3};
    \end{axis}
\end{tikzpicture}}\hfil
\subfigure[Second]{
\begin{tikzpicture}
    \begin{axis}[width=0.4\textwidth,xlabel={X axis}, ylabel={Y axis},]
        \addplot [blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}] coordinates {(-0.5,-1) (1,1)};
        \addplot [green, mark=*, ultra thick] coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot [red, mark=square*, dotted, ultra thick] coordinates {(-0.5,-1.1) (1,0.9)};
    \end{axis}
\end{tikzpicture}}
\caption{Caption.}
\end{figure*}

\end{document}

Intento 1

Como segundo intento, intenté utilizar la overlayopción del axisentorno (consulte la parte "Intento 2" en el mwe anterior). Esta vez, veo que el subfigureentorno recorta la parte de la leyenda que se encuentra fuera de la trama (ver imagen a continuación), y parece que no puedo encontrar ninguna opción para evitar esto.

Intento 2

Solo para mencionarlo, también intenté usar pgfplots'opción legend to name+' \ref, pero ni siquiera jugando con las diversas opciones de externalización pude tener éxito.

Cualquier sugerencia es bienvenida, gracias de antemano.

Respuesta1

Podrías usar la baselineopción tikzpictures, parece funcionar también para gráficos externalizados. Agrego name=axa las axisopciones (o legend style) y lo uso baseline=(ax.center)para las tres. También eliminé el \subfigure{}centro tikzpicture, ya que no es necesario.

Como complemento, en un caso como este podría resultar útil crear una lista de ciclos personalizada, así no tendrá que duplicar los estilos de trazado tres veces.

ingrese la descripción de la imagen aquí

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[pdftex]{graphicx}
\graphicspath{{./img/}}
\DeclareGraphicsExtensions{.pdf}
\usepackage{subfigure}
\usepackage{pgfplots}
\usetikzlibrary{external}
\tikzexternalize
\tikzsetexternalprefix{tikzpics/}
\pgfplotsset{
  compat=newest,
  every mark/.append style={mark size=1pt, mark line=solid},
}
% create a custom cycle list:
\pgfplotscreateplotcyclelist{MyList}{
blue, mark=diamond*, densely dashed, ultra thick, mark options={solid,scale=1.5}\\
green, mark=*, ultra thick\\
red, mark=square*, mark options={solid}, mark size=3pt,dotted, ultra thick\\
}
\begin{document}


\begin{figure*}
\centering
\subfigure[First]{
\begin{tikzpicture}[baseline=(ax.center)] % <-- added baseline
    \begin{axis}[
      name=ax, % added
      cycle list name=MyList, % added
      width=0.4\textwidth,
      xlabel={X axis},
      ylabel={Y axis}
]
        \addplot coordinates {(-0.5,-1) (1,1)};
        \addplot coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot coordinates {(-0.5,-1.1) (1,0.9)};
    \end{axis}
\end{tikzpicture}}\hfil
\begin{tikzpicture}[baseline=(leg.center)] % <-- added baseline
\begin{axis}[
   cycle list name=MyList, % added
   width=0.2\textwidth, height=0.2\textwidth,
   hide axis,
   xmin=0, xmax=10, ymin=0, ymax=0.2,
   legend columns=1,
   legend style={ 
     name=leg, % added
     draw=white!15!black,
     legend cell align=left,
      at={(0.5,0.5)}
     }]

    % add three dummy plots, the single point is outside the axis limits, so not shown
    \pgfplotsinvokeforeach{1,2,3}{\addplot coordinates {(0,-1)};}
    \addlegendentry{Trace 1}
    \addlegendentry{Trace 2}
    \addlegendentry{Trace 3}
\end{axis}
\end{tikzpicture}\hfil
\subfigure[Second]{
\begin{tikzpicture}[baseline=(ax.center)] % <-- added baseline option
    \begin{axis}[
       name=ax,  % added
       cycle list name=MyList, % added
       width=0.4\textwidth,
       xlabel={X axis}, ylabel={Y axis},
     ]
        \addplot coordinates {(-0.5,-1) (1,1)};
        \addplot coordinates {(-0.5,-0.9) (1,1.1)};
        \addplot coordinates {(-0.5,-1.1) (1,0.9)};
    \end{axis}
\end{tikzpicture}}
\caption{Caption.}
\end{figure*}
\end{document}

información relacionada