pgfplots:通过 \pgfplotstablegetcolumnnamebyindex 提取列名时,将“-indexX”添加到重复列

pgfplots:通过 \pgfplotstablegetcolumnnamebyindex 提取列名时,将“-indexX”添加到重复列

我正在用从中​​破解的宏从一个巨大的 CSV 中制作图表https://tex.stackexchange.com/a/45125https://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}

在此处输入图片描述

相关内容