使用数据列作为 pgfplotstable 表中的“轴”

使用数据列作为 pgfplotstable 表中的“轴”

我是 pgfplots/pgfplotstable 的新手,遇到了以下问题。我有一个如下所示的数据文件,用于使用 pgfplots 进行绘图:

P1 P2 Value
1 1 0.00000000000e+00
1 2 1.00000000000e-02
1 3 0.00000000000e+00

2 1 1.00000000000e-02
2 2 1.00000000000e-02
2 3 3.00000000000e-02

我可以使用 pgfplots 绘制此图:

\begin{tikzpicture}
\begin{axis}
[
height=15cm,
width=\textwidth%,
]
\addplot3[surf] table {../../results/testdatafile.dat};
\end{axis}
\end{tikzpicture}
\end{figure}

现在我想添加一个表格来显示如下数据:

P2/P1 1                 2
1     0.00000000000e+00 1.00000000000e-02
2     1.00000000000e-02 1.00000000000e-02
3     0.00000000000e+00 3.00000000000e-02

我不知道该如何实现这一点。如能得到任何帮助,我将不胜感激。

答案1

这使用 stringstrings \getargs 命令来获取/解析数据。然后我编写了一个 \readArray 命令来保存它。然后我可以从两个表中将数据调用到表格数组中。我可以使用保存的变量名称(第一个表)或使用 \Arrayij 命令(第二个表)来调用它

目前,stringstrings 数组大小限制为 500 个字符的字符串,但可以通过修改 stringstrings.sty 中的以下参数来增加大小。

\def\@MAXSTRINGSIZE{500}

我不知道对于较大的表来说它会变得多慢。stringstrings 可能会非常慢,这取决于操作。

对于我的简单示例,我不需要这样做。以下是代码:

\documentclass{article}
\usepackage{stringstrings}

\newcounter{index}
\newcounter{row}
\newcounter{col}

\newcommand\readArray[3]{
  \setcounter{index}{0}
  \setcounter{row}{1}
  \setcounter{col}{0}
  \getargs{#1}
  \whiledo{\value{index} < \narg}{%
    \addtocounter{index}{1}
%    \arabic{index}:~
    \addtocounter{col}{1}
    \ifthenelse{\value{col} > #3}
      {\addtocounter{row}{1}
       \addtocounter{col}{-#3}}
      {}
%    \arabic{row}-\arabic{col}\\
    \expandafter\edef\csname#2X\roman{row}X\roman{col}\endcsname%
      {\expandafter\csname arg\roman{index}\endcsname}
  }
}

\newcommand\Arrayij[3]{%
  \setcounter{row}{#2}
  \setcounter{col}{#3}
  \csname#1X\roman{row}X\roman{col}\endcsname
}

\begin{document}

\def\dataA{
.15 12 13 14
.20 22 23 24
.25 32 33 Ending
}
\def\dataB{
.15 x12 x13 x14
.20 z22 x23 x24
.25 x32 x33 xEnding
}

\readArray{\dataA}{arA}{4}
\readArray{\dataB}{arB}{4}

\begin{tabular}{lll}
Value & Data A & Data B\\
      & col3   & col3\\
\hline
\arAXiXi   & \arAXiXiii   & \arBXiXiii   \\
\arAXiiXi  & \arAXiiXiii  & \arBXiiXiii  \\
\arAXiiiXi & \arAXiiiXiii & \arBXiiiXiii \\
\end{tabular}

\vspace{1em}
\ldots or you can use the $\backslash$Arrayij command to invoke the
data

\begin{tabular}{lll}
Value & Data A & Data B\\
      & col4   & col4\\
\hline
\Arrayij{arA}{1}{1} & \Arrayij{arA}{1}{4} & \Arrayij{arB}{1}{4} \\
\Arrayij{arA}{2}{1} & \Arrayij{arA}{2}{4} & \Arrayij{arB}{2}{4} \\
\Arrayij{arA}{2}{1} & \Arrayij{arA}{3}{4} & \Arrayij{arB}{3}{4} \\
\end{tabular}

\end{document}

相关内容