如何修改 PGFPlotsTable 的单个元素?

如何修改 PGFPlotsTable 的单个元素?

我想创建一个包含一些值的表格。之后我想替换表格中的一个元素并显示一个图。我得到的最接近的结果,您可以在下面的最小示例中看到。因此有两个基本问题:

  1. 为什么表格显示修改后的值,但图表却没有显示?
  2. 我怎样才能在第一次绘图后修改表格,然后再次绘图,比如说在第 10 行第 2 列中使用数字 30?
\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}

\pgfplotstableset{
    create on use/x/.style={create col/expr={\pgfplotstablerow}},
    create on use/y/.style={create col/expr={10*\pgfplotstablerow}},
    every row 12 column y/.style={preproc/expr=(30)},}      %%%%% manipulated value
\pgfplotstablenew[columns={x,y}]{15}\loadedtable

\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot table[x index=0,y index=1] {\loadedtable};         %%%%% plot shows the old value
\end{axis}
\end{tikzpicture}

\pgfplotstabletypeset[columns/x/.style={string type}]{\loadedtable}  %%%%% table shows the new value
\end{document}

答案1

出现这种行为的原因是替换值的样式不是直接操作表格,而是在排版时操作其输出。

在下面的代码中,你可以看到单元格(12,) 内部仍然是 120,尽管它已使用 进行操作preproc/expr。我认为 设置的修改preproc/expr仅在使用 排版值时调用\pgfplotstabletypeset

\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18} 

\begin{document}

\pgfplotstableset{
    create on use/x/.style={create col/expr={\pgfplotstablerow}},
    create on use/y/.style={create col/expr={10*\pgfplotstablerow}},
    every row 12 column y/.style={preproc/expr=(30)}} %%%%% manipulated value
    
\pgfplotstablenew[columns={x, y}]{15}\loadedtable

\pgfplotstablegetelem{12}{y}\of{\loadedtable}
\pgfmathprintnumber{\pgfplotsretval}

\begin{tikzpicture}
\begin{axis}
\addplot table {\loadedtable};       %%%%% plot shows the old value
\end{axis}
\end{tikzpicture}

\pgfplotstabletypeset{\loadedtable}  %%%%% table shows the new value

\end{document}

在此处输入图片描述


为了真正改变相关单元格的值,您需要在创建时就对其进行分配,即在通过以下方式分配期间create col/expr

\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18} 

\begin{document}

\pgfplotstableset{
    create on use/x/.style={create col/expr={\pgfplotstablerow}},
    create on use/y/.style={create col/expr={(\pgfplotstablerow == 12 ? 30 : 10*\pgfplotstablerow)}}} %%%%% manipulated value upon creation of column
    
\pgfplotstablenew[columns={x, y}]{15}\loadedtable

\pgfplotstablegetelem{12}{y}\of{\loadedtable}
\pgfmathprintnumber{\pgfplotsretval}

\begin{tikzpicture}
\begin{axis}
\addplot table {\loadedtable};
\end{axis}
\end{tikzpicture}

\pgfplotstabletypeset{\loadedtable}

\end{document}

在此处输入图片描述


现在,您问如何先打印包含原始值的表格,然后在处理完值后再次打印。由于表格的值从未改变,因此这实际上是不可能的。但您可以通过为现有表格创建一个新列来执行类似操作,并向该列分配(再次通过create col/expr)另一组值。

\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18} 

\begin{document}

\pgfplotstableset{
    create on use/x/.style={create col/expr={\pgfplotstablerow}},
    create on use/y/.style={create col/expr={10*\pgfplotstablerow}}}

\pgfplotstablenew[columns={x, y}]{15}\loadedtable

\begin{tikzpicture}
\begin{axis}
\addplot table {\loadedtable};
\end{axis}
\end{tikzpicture}

\pgfplotstabletypeset{\loadedtable}

\pgfplotstablecreatecol[
    create col/expr={(\pgfplotstablerow == 12 ? 30 : 10*\pgfplotstablerow)}]
    {yy}\loadedtable

\begin{tikzpicture}
\begin{axis}
\addplot table[y=yy] {\loadedtable};
\end{axis}
\end{tikzpicture}

\pgfplotstabletypeset[columns={x, yy}, columns/{yy}/.style={column name=y}]{\loadedtable}

\end{document}

事实上,您当然可以在一开始就调用分配第三列的\pgfplotstableset其他值create on use/yy/.style={create col/expr=...。}

在此处输入图片描述

相关内容