pgfplotstable:如何访问列名?

pgfplotstable:如何访问列名?

我曾经\pgfplotstableset在序言中指定列名。但是,我不知道如何访问它们。

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots, pgfplotstable, filecontents}
\pgfplotsset{compat=1.6}

\begin{filecontents}{test.dat}
  Time Distance
   0 0 
   1 1 
   3 2 
\end{filecontents}

\pgfplotstableset{
   columns/Time/.style={
     column name={$t_{\alpha}$},
   },
   columns/Distance/.style={
      column name={$D_{\alpha}$},
   },
}

\begin{document}
  \pgfplotstableread{test.dat}\loadedtable

  \pgfplotstabletypeset{\loadedtable}

  \pgfplotstableforeachcolumn\loadedtable\as\col{%
     column name is ‘\col’; index is \pgfplotstablecol;\par
  }
\end{document}

表中的列名已正确修改,但当我尝试使用访问它们时,\col却无法获取修改后的名称。列名的键是什么?

由于pgfplots不支持列名中的数学模式表达式,我计划\pgfplotstableset在序言中使用它来创建文档范围的列名列表,然后将其用于整个文档中的图表中的图例。

编辑:我也试过

\foreach \y in {0,1}{
  \pgfplotstablegetcolumnnamebyindex{\y}\of{\loadedtable}\to{\colname}
  \colname
}

获取列名。但结果相同。此外,在 v1.6\pgfplotstablegetcolumnnamebyindex手册中未提及pgfplotstable。我从此处的另一篇文章中了解到。

编辑2:进一步探讨该问题。考虑以下代码和 latex 文件的输出。

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz,pgfplots,pgfplotstable,filecontents}
\pgfplotsset{compat=1.6}
\begin{filecontents}{test1.dat}
  Time Distance
  1 1
\end{filecontents}

\begin{filecontents}{test2.dat}
  Time Velocity
  2 3
\end{filecontents}

\begin{document}
\pgfplotstableread{test1.dat}\tableone \pgfplotstableread{test2.dat}\tabletwo

\noindent \pgfplotstabletypeset{\tableone}\\
\pgfplotstabletypeset{\tabletwo}\newline\line(1,0){80}

\pgfplotstableset{
   columns/Time/.style={
     column name={$t_{\alpha}$},
   }
}    

\noindent \pgfplotstabletypeset{\tableone}\\
\pgfplotstabletypeset{\tabletwo}\newline\line(1,0){80}

\pgfkeyssetvalue{/pgfplots/table/column name}{$t_{\beta}$}

\noindent \pgfplotstabletypeset{\tableone}\\
\pgfplotstabletypeset{\tabletwo}\newline\line(1,0){80}

\pgfkeysvalueof{/pgfplots/table/column name}
\end{document}

输出为: 在此处输入图片描述

所以在这里我展示了它\pgfplotstableset确实很有用。一旦在列标题(从输入文件中读取)和想要显示的列名之间建立了关联,它将在多个表中有用。正如@percusse 指出的那样,正如手册中提到的那样\pgfplotstable,由于定义的范围仅限于,因此无法使用此功能\pgfplotstabletypeset

我希望改用\pgfkeys。在pgfplotstable.code.tex查看了 key 的实现之后column name,我尝试(未成功)使用\pgfkeys。我对 还不熟悉\pgfkeys,因此无法弄清楚如何访问单个列名。

等待新的想法。

答案1

正如 @percusse 正确指出的那样,这里的根本挑战是这些columns/<name>/.style事情只能在的上下文中进行解释\pgfplotstabletypeset

一个解决方案也是对你的问题的直接回答,并解决了 MWE 意味着从正确的上下文中查询信息的问题。这比听起来要简单,我可以在下面给出这样的例子。它不需要任何内部知识pgfplotstable。它只依赖于pgfkeys基本的 TeX 扩展控制。

解决方案如下:

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots, pgfplotstable, filecontents}
\pgfplotsset{compat=1.6}

\begin{filecontents}{test.dat}
  Time Distance
   0 0 
   1 1 
   3 2 
\end{filecontents}

\pgfplotstableset{
   columns/Time/.style={
     column name={$t_{\alpha}$},
   },
   columns/Distance/.style={
      column name={$D_{\alpha}$},
   },
}

% defines \devendraretval to contain the display name for the column
% named '#1' 
%
% #1: a column name
\def\getcolumndisplayname#1{%
     % we WANT a group. Otherwise, any values set in these style would
     % become global and they would be mixed up between different
     % columns.
     \begingroup
         % Access the contents of column's display name programmatrically:
        \pgfplotstableset{columns/#1/.try}%
        \pgfkeysgetvalue{/pgfplots/table/column name}\temp
        \ifx\temp\empty
            % oh. We have no such value! Ok, use the column name as
            % such.
            \edef\temp{#1}%
        \fi
        % this here is one of the possible patterns to communicate a
        % local variable outside of a local group:
        \global\let\GLOBALTEMP=\temp
     \endgroup
     \let\devendraretval=\GLOBALTEMP
     %
}%

\begin{document}
\thispagestyle{empty}
  \pgfplotstableread{test.dat}\loadedtable

  \pgfplotstabletypeset{\loadedtable}

  \pgfplotstableforeachcolumn\loadedtable\as\col{%
     %
     \getcolumndisplayname{\col}%
     column name is ‘\col’; index is \pgfplotstablecol; display name is `\devendraretval'\par
  }

  \getcolumndisplayname{Time}%
  Value of Time is \devendraretval.
\end{document}

在此处输入图片描述

它定义了一个新的命令“\getcolumndisplayname{}”来检索它。

请参阅http://pgfplots.sourceforge.net/TeX-programming-notes.pdf了解基本说明的详细信息。

答案2

来自我评论的替代方案(以及来自 使用表格的第一行作为 pgfplot 图中的图例条目?):

\documentclass[border=1pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.6}

\pgfplotstableread{
time distance velocity something
0 0 1 0.2
1 1 1 0.3
1.999 1.999 1 0.4
2 2 0 0.4
3 2 0 0.5
}\mytable

\pgfplotstableread{
name alias
time $t$
distance $d_\alpha$
velocity $\sin(2t)$
something nothing
}\tablenames

\pgfplotstablegetcolsof{\mytable}
\pgfmathtruncatemacro\numberofcols{\pgfplotsretval-1}

\begin{document}
\begin{tikzpicture}
\begin{axis}
\pgfplotsinvokeforeach{1,...,\numberofcols}{
  \addplot table [y index=#1] \mytable;
  \pgfplotstablegetelem{#1}{[index] 1}\of{\tablenames}
  \addlegendentryexpanded{\pgfplotsretval} 
}
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容