Anexo, nueva leyenda

Anexo, nueva leyenda

Estoy bastante cerca de terminar mi pgfplotsdiagrama para ilustrar mis datos experimentales.

Lo único que no funciona hasta ahora es mi leyenda. Mi código y el problema se pueden ver en preguntas anteriores: primero, segundo, tercero.

El principal problema se muestra en la "tercera" pregunta. Debido al hecho de que no puedo incluir una leyenda adecuada, \legendpensé en "construir" una leyenda a mano dentro de mi trama.

Este es el código que produje:

\begin{filecontents*}{data.txt}
a b d c
9 1 a 2   
8 2 b 4   
7 3 c 6   
6 4 d 8   
5 5 e 10  
4 6 f 12  
3 7 g 14  
2 8 x 16  
1 9 x 18  
\end{filecontents*}
\documentclass[paper=a4,ngerman,xcolor=dvipsnames]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usepackage{siunitx}
\usepackage{caption}
\usepackage{graphicx}
\usepackage{lipsum}

\pgfplotscreateplotcyclelist{mycolorlist}{
blue!99!black,dashed,every mark/.append style={fill=blue!10!black},mark=+\\
red!99!black,solid,every mark/.append style={fill=blue!10!black},mark=+\\
green!99!black,densely dashed,every mark/.append style={fill=blue!10!black},mark=+\\
yellow!80!black,every mark/.append style={fill=blue!10!black},mark=+\\
}

\def\showmark#1{\tikz\node[red!95!black]{\pgfuseplotmark{#1}};}

\begin{document}
\begin{figure}
  \begin{tikzpicture}
    \begin{axis}[
        grid=both,
        width=12cm, 
        height=9cm,
        axis equal,
        xtick pos=left,
        ytick pos=left,
        title style={draw,fill=none,name=legend},
        title={%
            \showmark{pentagon*}=$\SI{100}{\kilo\Hz}$,
            \showmark{triangle*}=$\SI{10}{\kilo\Hz}$,
            \showmark{square*}=$\SI{1}{\kilo\Hz}$,
            \showmark{diamond*}=$\SI{100}{\Hz}$,
            \showmark{10-pointed star}=$\SI{10}{\Hz}$,
            \showmark{oplus}=$\SI{1}{\Hz}$,
            \showmark{o}=$\SI{20}{\mHz}$},
        xlabel={R}, ylabel={Z}, 
        legend style={at={(0.02,0.98)},anchor=north west,cells={anchor=west}},
        legend style={font=\footnotesize},
        cycle list name=mycolorlist,
        scatter,
        point meta=explicit symbolic,
        scatter/classes={
          x={},% empty argument means: use the default style       
          g={mark=pentagon*,red!95!black},
          f={mark=triangle*,red!95!black},
          e={mark=square*,red!95!black},
          d={mark=diamond*,red!95!black},
          c={mark=10-pointed star,red!95!black},
          b={mark=oplus,red!95!black},
          a={mark=o,red!95!black},
          z={mark=*,red!80!black}
          },
        ]
        \draw [fill=white](-4,10) rectangle (2.0,14) ;
        \draw[color=green] (-3.5,13.0)--(-2.5,13.0);
        \node[mark size=2pt, color=green] at(-3.0,13.0)         {\pgfuseplotmark{*}};
        \node[font=\footnotesize] at (-0.7,12.95) {Zyklus 0};
        \draw[color=green] (-3.5,12.0)--(-2.5,12.0);
        \node[mark size=2pt, color=green] at(-3.0,12.0)         {\pgfuseplotmark{*}};
        \node[font=\footnotesize] at (-0.7,11.95) {Zyklus 1};
        \addplot table [x=b,y=c, meta=d]{data.txt};
        \addplot table [x=c,y=b, meta=d]{data.txt};
        \addplot table [x=a,y=c, meta=d]{data.txt};
        \addplot table [x=b,y=a, meta=d]{data.txt};

        \legend{1, 2, 3 ,4}
   \end{axis}
  \end{tikzpicture}
\end{figure}
\end{document}

Bastante parecido a la leyenda normal (la de arriba) y finalmente el color y el marcador son correctos para "Zyklus 1"

ingrese la descripción de la imagen aquí

Mi pregunta es ¿puedo usar este código para otros gráficos (los valores de X e Y variarán)? Entonces, para hacerlo, me gustaría colocar la leyenda y los nodos con respecto a los ejes Y en lugar de escribir todos los números una y otra vez para cada gráfico. ¿Es eso posible?

Respuesta1

Esto puede ser de interés. Primero, agrego name=mylegendal legend style. Luego uso a \matrixpara hacer la segunda leyenda, colocada en relación con la primera leyenda. Una pfgplotsleyenda también es una \matrix, por lo que el método es el mismo para ambas.

El siguiente código es lo que forma la nueva leyenda. Tenga en cuenta que debe colocarseafuerael axisentorno, ya que la mylegendreferencia no está disponible dentro de él.

 \matrix (m) [
           fill=white,
           draw=black,
           below=3pt of mylegend.south west,
           anchor=north west,
           cells={anchor=west}]
         {
          \LegendImage{color=green,mark=*,mark size=2pt} &  \LegendEntry{Zuklus 0}; \\
          \LegendImage{color=green,mark=o,mark size=2pt} &  \LegendEntry{Zuklus 1}; \\
         };

La \LegendImagemacro personalizada usa la misma definición pgfplotspara dibujar una leyenda de línea, mientras que LegendEntryes solo un nodo con un estilo similar a su definición en el archivo legend style.

\newcommand\LegendImage[1]{% from pgfplots.code.tex
\draw[%
                /pgfplots/mesh=false,%
                bar width=3pt,% 
                bar shift=0pt,%
                %
                mark repeat=2,%
                mark phase=2,#1] 
                plot coordinates {
                    (0cm,0cm) 
                    (0.3cm,0cm)
                    (0.6cm,0cm)%
                };
}
\newcommand\LegendEntry[1]{\node[anchor=west,black,font=\footnotesize,inner xsep=2pt]{#1};}

Salida y código completo a continuación.

ingrese la descripción de la imagen aquí

\begin{filecontents*}{data.txt}
a b d c
9 1 a 2   
8 2 b 4   
7 3 c 6   
6 4 d 8   
5 5 e 10  
4 6 f 12  
3 7 g 14  
2 8 x 16  
1 9 x 18  
\end{filecontents*}
\documentclass[paper=a4,ngerman,xcolor=dvipsnames]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usetikzlibrary{positioning}
\usepackage{siunitx}

\newcommand\LegendImage[1]{% from pgfplots.code.tex
\draw[%
                /pgfplots/mesh=false,%
                bar width=3pt,% 
                bar shift=0pt,%
                %
                mark repeat=2,%
                mark phase=2,#1] 
                plot coordinates {
                    (0cm,0cm) 
                    (0.3cm,0cm)
                    (0.6cm,0cm)%
                };
}
\newcommand\LegendEntry[1]{\node[anchor=west,black,font=\footnotesize,inner xsep=2pt]{#1};}

\pgfplotscreateplotcyclelist{mycolorlist}{
blue!99!black,dashed,every mark/.append style={fill=blue!10!black},mark=+\\
red!99!black,solid,every mark/.append style={fill=blue!10!black},mark=+\\
green!99!black,densely dashed,every mark/.append style={fill=blue!10!black},mark=+\\
yellow!80!black,every mark/.append style={fill=blue!10!black},mark=+\\
}

\def\showmark#1{\tikz\node[red!95!black]{\pgfuseplotmark{#1}};}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[
        grid=both,
        width=12cm, 
        height=9cm,
        axis equal,
        xtick pos=left,
        ytick pos=left,
        title style={draw,fill=none,name=legend},
        title={%
            \showmark{pentagon*}=$\SI{100}{\kilo\Hz}$,
            \showmark{triangle*}=$\SI{10}{\kilo\Hz}$,
            \showmark{square*}=$\SI{1}{\kilo\Hz}$,
            \showmark{diamond*}=$\SI{100}{\Hz}$,
            \showmark{10-pointed star}=$\SI{10}{\Hz}$,
            \showmark{oplus}=$\SI{1}{\Hz}$,
            \showmark{o}=$\SI{20}{\mHz}$},
        xlabel={R}, ylabel={Z}, 
        legend style={
             at={(0.02,0.98)},
             anchor=north west,
             cells={anchor=west},
             font=\footnotesize,
             name=mylegend
             },
        cycle list name=mycolorlist,
        scatter,
        point meta=explicit symbolic,
        scatter/classes={
          x={},% empty argument means: use the default style       
          g={mark=pentagon*,red!95!black},
          f={mark=triangle*,red!95!black},
          e={mark=square*,red!95!black},
          d={mark=diamond*,red!95!black},
          c={mark=10-pointed star,red!95!black},
          b={mark=oplus,red!95!black},
          a={mark=o,red!95!black},
          z={mark=*,red!80!black}
          },
        ]

        \addplot table [x=b,y=c, meta=d]{data.txt};
        \addplot table [x=c,y=b, meta=d]{data.txt};
        \addplot table [x=a,y=c, meta=d]{data.txt};
        \addplot table [x=b,y=a, meta=d]{data.txt};

        \legend{1, 2, 3 ,4}
   \end{axis}
 \matrix (m) [
           fill=white,
           draw=black,
           below=3pt of mylegend.south west,
           anchor=north west,
           cells={anchor=west}]
         {
          \LegendImage{color=green,mark=*,mark size=2pt} &  \LegendEntry{Zuklus 0}; \\
          \LegendImage{color=green,mark=o,mark size=2pt} &  \LegendEntry{Zuklus 1}; \\
         };
\end{tikzpicture}
\end{document}

Anexo, nueva leyenda

Dados los comentarios, supongo que lo que busca es rel axis cscolocar la leyenda personalizada.

\begin{filecontents*}{data.txt}
a b d c
9 1 a 2   
8 2 b 4   
7 3 c 6   
6 4 d 8   
5 5 e 10  
4 6 f 12  
3 7 g 14  
2 8 x 16  
1 9 x 18  
\end{filecontents*}
\documentclass[paper=a4,ngerman,xcolor=dvipsnames]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usetikzlibrary{positioning}
\usepackage{siunitx}

\newcommand\LegendImage[1]{% from pgfplots.code.tex
\draw[%
                /pgfplots/mesh=false,%
                bar width=3pt,% 
                bar shift=0pt,%
                %
                mark repeat=2,%
                mark phase=2,#1] 
                plot coordinates {
                    (0cm,0cm) 
                    (0.3cm,0cm)
                    (0.6cm,0cm)%
                };
}
\newcommand\LegendEntry[1]{\node[anchor=west,black,font=\footnotesize,inner xsep=2pt]{#1};}

\pgfplotscreateplotcyclelist{mycolorlist}{
blue!99!black,dashed,every mark/.append style={fill=blue!10!black},mark=+\\
red!99!black,solid,every mark/.append style={fill=blue!10!black},mark=+\\
green!99!black,densely dashed,every mark/.append style={fill=blue!10!black},mark=+\\
yellow!80!black,every mark/.append style={fill=blue!10!black},mark=+\\
}

\def\showmark#1{\tikz\node[red!95!black]{\pgfuseplotmark{#1}};}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[
        grid=both,
        width=12cm, 
        height=9cm,
        axis equal,
        xtick pos=left,
        ytick pos=left,
        title style={draw,fill=none,name=legend},
        title={%
            \showmark{pentagon*}=$\SI{100}{\kilo\Hz}$,
            \showmark{triangle*}=$\SI{10}{\kilo\Hz}$,
            \showmark{square*}=$\SI{1}{\kilo\Hz}$,
            \showmark{diamond*}=$\SI{100}{\Hz}$,
            \showmark{10-pointed star}=$\SI{10}{\Hz}$,
            \showmark{oplus}=$\SI{1}{\Hz}$,
            \showmark{o}=$\SI{20}{\mHz}$},
        xlabel={R}, ylabel={Z}, 
        legend style={
             at={(0.02,0.98)},
             anchor=north west,
             cells={anchor=west},
             font=\footnotesize,
             name=mylegend
             },
        cycle list name=mycolorlist,
        scatter,
        point meta=explicit symbolic,
        scatter/classes={
          x={},% empty argument means: use the default style       
          g={mark=pentagon*,red!95!black},
          f={mark=triangle*,red!95!black},
          e={mark=square*,red!95!black},
          d={mark=diamond*,red!95!black},
          c={mark=10-pointed star,red!95!black},
          b={mark=oplus,red!95!black},
          a={mark=o,red!95!black},
          z={mark=*,red!80!black}
          },
        ]

        \addplot table [x=b,y=c, meta=d]{data.txt};
        \addplot table [x=c,y=b, meta=d]{data.txt};
        \addplot table [x=a,y=c, meta=d]{data.txt};
        \addplot table [x=b,y=a, meta=d]{data.txt};

        % coordinate for upper left corner of legend
        \coordinate (legpos) at (rel axis cs:0.02,0.98);

%% this works, but the top marker from the green line is drawn on top of the legend. I don't know why.
%        \matrix (m) at (rel axis cs:0.02,0.98) [
%           fill=white,
%           draw=black,
%           anchor=north west,
%           cells={anchor=west},
%           ampersand replacement=\&,
%           on layer=axis foreground]
%         {
%          \LegendImage{color=green,mark=*,mark size=2pt} \&  \LegendEntry{Zuklus 0}; \\
%          \LegendImage{color=green,mark=o,mark size=2pt} \&  \LegendEntry{Zuklus 1}; \\
%         };

   \end{axis}
        \matrix (m) at (legpos) [
           fill=white,
           draw=black,
           anchor=north west,
           cells={anchor=west}]
         {
          \LegendImage{color=green,mark=*,mark size=2pt} &  \LegendEntry{Zuklus 0}; \\
          \LegendImage{color=green,mark=o,mark size=2pt} &  \LegendEntry{Zuklus 1}; \\
         };

\end{tikzpicture}
\end{document}

información relacionada