我正在用从中破解的宏从一个巨大的 CSV 中制作图表https://tex.stackexchange.com/a/45125和https://tex.stackexchange.com/a/24023 选择开始/结束列并添加它们等。但重复的图例条目有一个 -index#,其中 # 是列号。能否帮助 pgfplots 准确显示 csv 第一行中的图例条目?我尝试使用 {} 保护条目。这没有用。手动添加图例实际上不是一个选项。
\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\usepackage{filecontents}
\begin{filecontents}{testdata.dat}
AB;AB+;AB;ABerror;AB+error;ABerror;
1; 2; 3; 0.2; 0.1; 0.1;
2; 3; 4; 0.3; 0.2; 0.2;
3; 4; 5; 0.4; 0.3; 0.3;
4; 5; 6; 0.5; 0.4; 0.4;
\end{filecontents}
\begin{document}
\pgfplotsset{%
table/col sep = semicolon}
\newcommand{\plotfile}[1]{%
\pgfplotstableread{#1}{\table}
\pgfplotstablegetcolsof{#1}
\pgfmathtruncatemacro\numberofcols{\pgfplotsretval - 1}
\pgfplotsinvokeforeach{0,...,\numberofcols}{%
\pgfplotstablegetcolumnnamebyindex{##1}\of{\table}\to{\colname}
\addplot+[] table [x expr=\coordindex,y
index=##1] {#1};
\addlegendentryexpanded{\colname}
}
}
\newcommand{\plotfileLegend}[4]{%
\pgfplotstableread{#1}{\table}
\pgfplotstablegetcolsof{#1}
\pgfmathtruncatemacro\numberofcols{(#3+1-#2)/2}
\pgfmathtruncatemacro\startcol{#2-1}
\pgfmathtruncatemacro\endcol{#3-\numberofcols-1}
\pgfplotsinvokeforeach{\startcol,...,\endcol}{%
\pgfmathtruncatemacro\errorcolumn{##1+\numberofcols}
\addplot table [x expr=\coordindex/#4,y index=##1, y error index = \errorcolumn] {#1};
\pgfplotstablegetcolumnnamebyindex{##1}\of{\table}\to{\colname}
\addlegendentryexpanded{\colname}
}
}
\begin{tikzpicture}
\begin{axis}[xlabel={Influx},
ylabel={Center of mass},
ymode=log,
legend style={
font=\footnotesize,
at={(1.3,1)},
anchor=north east},
error bars/y dir=both,
error bars/y explicit,
error bars/error mark=none,
error bars/error bar style={line width=0.8,solid}]
\plotfileLegend{testdata.dat}{1}{6}{1}
\end{axis}
\end{tikzpicture}
\end{document}
我仍然不太清楚它的工作原理。手册中对 \pgfplotstablegetcolumnnamebyindex 的引用在哪里?
答案1
如果您查看向您抛出的警告pgfplots
,它会检测到有重复的 col 名称,并尝试通过后缀 来帮助您为它们提供替代名称--index[<duplicate number>]
。所以这是预料之中的。但是,您可以截断要显示在图例条目中的名称。
我xstring
偷懒地查看名称中是否存在双破折号,然后相应地截断。此外,我稍微修改了宏,使第二个条目现在是一个数组,\foreach
这样您就可以有选择地绘制它们。第三个条目是要跳过的列数,以到达该特定列的错误列。
文档在pgfplotstable
手册中。
\documentclass{standalone}
\usepackage{pgfplotstable,xstring,filecontents}
\pgfplotsset{compat=1.10,table/col sep = semicolon}
\begin{filecontents}{testdata.dat}
AB;AB+;AB;ABerror;AB+error;ABerror
1; 2; 3; 0.2; 0.1; 0.1
2; 3; 4; 0.3; 0.2; 0.2
3; 4; 5; 0.4; 0.3; 0.3
4; 5; 6; 0.5; 0.4; 0.4
\end{filecontents}
\newcommand{\plotfileLegend}[4]{%
\pgfplotstableread{#1}{\table}
\pgfplotsinvokeforeach{#2}{%
\pgfmathtruncatemacro\errorcolumn{##1 + #3}
\addplot table [x expr=\coordindex/#4,y index=##1, y error index = \errorcolumn] {\table};
\pgfplotstablegetcolumnnamebyindex{##1}\of{\table}\to{\colname}
\StrBefore{\colname}{--}[\mycolname]
\addlegendentryexpanded{\ifx\empty\mycolname\relax\colname\else\mycolname\fi}
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xlabel={Influx},
ylabel={Center of mass},
ymode=log,
legend style={
font=\footnotesize,
at={(1.3,1)},
anchor=north east},
error bars/y dir=both,
error bars/y explicit,
error bars/error mark=none,
error bars/error bar style={line width=0.8,solid}]
\plotfileLegend{testdata.dat}{0,...,2}{3}{1}
\end{axis}
\end{tikzpicture}
\end{document}