我想创建一个包含一些值的表格。之后我想替换表格中的一个元素并显示一个图。我得到的最接近的结果,您可以在下面的最小示例中看到。因此有两个基本问题:
- 为什么表格显示修改后的值,但图表却没有显示?
- 我怎样才能在第一次绘图后修改表格,然后再次绘图,比如说在第 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=
...。}