Lectura automática de la columna de la tabla pgfplots para la leyenda con comandos de modo matemático/látex

Lectura automática de la columna de la tabla pgfplots para la leyenda con comandos de modo matemático/látex

Esta es una pregunta de seguimiento para¿Cómo se pueden utilizar varias columnas pgfplotstable en una leyenda??

Probé el ejemplo de trabajo mínimo desde allí y reemplacé uno de los nombres de columna con

{$R_0 = \SI{10}{\kilo\ohm}$}

como esto:

\documentclass[]{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepgfplotslibrary{groupplots}

\pgfplotsset{% global config
  compat=newest,
  every minor tick={very thin, gray},
  minor tick num=4,
  enlargelimits=0.02,
  group style={
    columns=2,
    xlabels at=edge bottom,
    ylabels at=edge left},
  every axis legend/.append style={
    legend cell align=left,
    legend columns=4
  }
}

\pgfplotstableread{
  Time      {Model A}   {Model G}   {$R_0 = \SI{10}{\kilo\ohm}$}
  0         1           1           1
  1         1           2           2
  2         2           3           3
  3         3           4           4
  4         5           5           8
  5         8           6           10
  6         13          7           16
}\modeltable

\pgfplotstableread{
  Time      {Data 1}  {Data 2}
  0         1.3       2.3
  1         2.6       3.6
  2         3.8       4.8
  3         7.9       5.9
  4         6.3       7.3
  5         7.5       6.5
  6         9.0       8.9
}\datatable

\begin{document}

  \begin{tikzpicture}

    \begin{groupplot}[
      xlabel={Time},
      ylabel={Amplitude},
      every axis title shift=0,
      legend to name=grouplegend,
      legend style={/tikz/every even column/.append style={column sep=0.5cm}}
     ]

      \pgfplotsinvokeforeach{1,2}{%
        \nextgroupplot[title=Data $#1$]

        % Models
        \foreach \y in {1, 2, 3} {
          \addplot [smooth, dashed, color=DarkRed]
            table[x index=0, y index=\y] {\modeltable};

          \pgfplotstablegetcolumnnamebyindex{\y}\of{\modeltable}\to{\colname}
          \addlegendentryexpanded{\colname}
        }

        % Data
        \addplot [only marks, mark=o]
          table[x index=0, y index=#1] {\datatable};
        \addlegendentry {Data}
      }

    \end{groupplot}

    \node (dummytitle) at ($(group c1r1.north)!0.5!(group c2r1.north)$)
      [above]{};
    \node (title) at (dummytitle.north)
      [above, yshift=\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {Experimental Data};

    \node (legend) at ($(group c1r1.south)!0.5!(group c2r1.south)$)
      [below, yshift=-2\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {\ref{grouplegend}};

  \end{tikzpicture}

\end{document}

Sin embargo, esto no se compila.

El primer error en el registro es:

)) ! Secuencia de control Indefinido. $R_0 = \SI {10}{\kilo \ohm }$ l.33 }\modeltable

Con un par de secuelas. Solo no funciona cuando coloco la cadena matemática en pgfplottable. En otras partes del documento funciona como se esperaba.

Entonces, ¿me imagino que el analizador pgfplots no puede manejar nombres de columnas que contengan comandos de látex y/o modo matemático?

Respuesta1

Esto crea macros \namesuby \createsubsimplemente las reemplaza \colnamecon un sustituto predefinido (si existe).

\documentclass[]{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepgfplotslibrary{groupplots}

\pgfplotsset{% global config
  compat=newest,
  every minor tick={very thin, gray},
  minor tick num=4,
  enlargelimits=0.02,
  group style={
    columns=2,
    xlabels at=edge bottom,
    ylabels at=edge left},
  every axis legend/.append style={
    legend cell align=left,
    legend columns=4
  }
}

\pgfplotstableread{
  Time      {Model A}   {Model G}   R0
  0         1           1           1
  1         1           2           2
  2         2           3           3
  3         3           4           4
  4         5           5           8
  5         8           6           10
  6         13          7           16
}\modeltable

\pgfplotstableread{
  Time      {Data 1}  {Data 2}
  0         1.3       2.3
  1         2.6       3.6
  2         3.8       4.8
  3         7.9       5.9
  4         6.3       7.3
  5         7.5       6.5
  6         9.0       8.9
}\datatable

\makeatletter
\newcommand{\namesub}[1]% #1 = column name
  {\@ifundefined{name.#1}{#1}{\csname name.#1\endcsname}}

\newcommand{\createsub}[2]% #1 = column name, #2 = substituted name
  {\@ifundefined{name.#1}{\expandafter\def\csname name.#1\endcsname{#2}}%
    {\errmessage{Name #1 already in use}}}
\makeatother

\createsub{R0}{$R_0 = \SI{10}{\kilo\ohm}$}

\begin{document}

  \begin{tikzpicture}

    \begin{groupplot}[
      xlabel={Time},
      ylabel={Amplitude},
      every axis title shift=0,
      legend to name=grouplegend,
      legend style={/tikz/every even column/.append style={column sep=0.5cm}}
     ]

      \pgfplotsinvokeforeach{1,2}{%
        \nextgroupplot[title=Data $#1$]

        % Models
        \foreach \y in {1, 2, 3} {
          \addplot [smooth, dashed, color=DarkRed]
            table[x index=0, y index=\y] {\modeltable};

          \pgfplotstablegetcolumnnamebyindex{\y}\of{\modeltable}\to{\colname}
          \addlegendentryexpanded{\namesub\colname}
        }

        % Data
        \addplot [only marks, mark=o]
          table[x index=0, y index=#1] {\datatable};
        \addlegendentry {Data}
      }

    \end{groupplot}

    \node (dummytitle) at ($(group c1r1.north)!0.5!(group c2r1.north)$)
      [above]{};
    \node (title) at (dummytitle.north)
      [above, yshift=\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {Experimental Data};

    \node (legend) at ($(group c1r1.south)!0.5!(group c2r1.south)$)
      [below, yshift=-2\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {\ref{grouplegend}};

  \end{tikzpicture}

\end{document}

información relacionada