
Esta é uma pergunta de acompanhamento paraComo várias colunas pgfplotstable podem ser usadas em uma legenda?
Tentei o exemplo mínimo de trabalho a partir daí e substituí um dos nomes das colunas por
{$R_0 = \SI{10}{\quilo\ohm}$}
assim:
\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}
No entanto, isso não compila.
O primeiro erro no log é:
)) ! Sequência de controle indefinida. $R_0 = \SI {10}{\quilo \ohm }$ l.33 }\modeltable
Com alguns efeitos posteriores. Só não funciona quando coloco a string matemática no pgfplottable. Em outras partes do documento funciona conforme o esperado.
Então eu acho que o analisador pgfplots não pode lidar com nomes de colunas contendo comandos latex e/ou modo matemático?
Responder1
Isso cria macros \namesub
que \createsub
simplesmente substituem \colname
por um substituto predefinido (se existir).
\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}