
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 \namesub
y \createsub
simplemente las reemplaza \colname
con 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}