
Dies ist eine Folgefrage zuWie können mehrere pgfplotstable-Spalten in einer Legende verwendet werden??
Ich habe das minimale funktionierende Beispiel von dort ausprobiert und einen der Spaltennamen durch
{$R_0 = \SI{10}{\kilo\ohm}$}
so was:
\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}
Dies lässt sich jedoch nicht kompilieren.
Der erste Fehler im Protokoll ist:
)) ! Undefinierte Steuersequenz. $R_0 = \SI {10}{\kilo \ohm }$ l.33 }\modeltable
Mit ein paar Nachwirkungen. Es funktioniert nur nicht, wenn ich die mathematische Zeichenfolge in die pgfplottable einfüge. An anderen Stellen im Dokument funktioniert es wie erwartet.
Ich gehe also davon aus, dass der Pgfplots-Parser keine Spaltennamen verarbeiten kann, die Latex-Befehle und/oder den Mathematikmodus enthalten?
Antwort1
Dadurch werden Makros erstellt \namesub
, \createsub
die einfach \colname
durch einen vordefinierten Ersatz (sofern vorhanden) ersetzt werden.
\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}