我有一定数量的输入文件 (.txt),用于最终定义我的轴环境的 y 数据。x 数据来自不同的文件。目标是将输入文件的每一行相加(对于我的 y 数据是必需的)并将它们乘以例如 -1。
因此我的 Y 数据所需的文件可能如下所示:
\begin{filecontents}{n1b1_f1.txt}
2
3
\end{filecontents}
\begin{filecontents}{n1b2_f1.txt}
4
5
\end{filecontents}
\begin{filecontents}{n1b3_f1.txt}
6
7
\end{filecontents}
\begin{filecontents}{n1b4_f1.txt}
8
9
\end{filecontents}
X 数据的文件如下
\begin{filecontents}{X.txt}
1
2
\end{filecontents}
现在的最终目标是绘制一个 xy 图,其中x(i)=X(i)
给出当前线的编号。y(i)=(n1b1_f1(i)+n1b2_f1(i)+n1b3_f1(i)+n1b4_f1(i))*-1
i
我的 y 数据所需的输入文件数量可能会发生变化,但不会超过 9,现在的问题在于我是否必须“手动”进行此类采用
我一般不知道之前的行数。我必须查找它们,但如果它可以自动处理任意行数,那就太好了。
答案1
这是一个新宏\mergetables{<list of table names>}{<output table>}
,您可以使用它将多个表合并为一个。在您的示例中,您可以使用
\mergetables{X, n1b1_f1, n1b2_f1, n1b3_f1, n1b4_f1}{\datatable}
假设文件名为X.txt
、n1b1_f1.txt
等。在你的图中,你可以使用类似
\addplot table [y expr=(\tr{n1b1_f1}+\tr{n1b2_f1}-\tr{n1b3_f1})*-1]{\datatable};
将三列相加并乘以-1
。
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepackage{filecontents}
\begin{filecontents}{X.txt}
1
2
3
\end{filecontents}
\begin{filecontents}{n1b1_f1.txt}
2
3
5
\end{filecontents}
\begin{filecontents}{n1b2_f1.txt}
4
5
8
\end{filecontents}
\begin{filecontents}{n1b3_f1.txt}
6
7
2
\end{filecontents}
\begin{filecontents}{n1b4_f1.txt}
8
9
1
\end{filecontents}
\newcommand{\mergetables}[2]{
\newif\iffirstrow
\firstrowtrue
\pgfplotsforeachungrouped \tablename in {#1}{
\iffirstrow
\pgfplotstableread{\tablename.txt}\temptable
\pgfplotstabletranspose[input colnames to=colnames]{\temptabletransposed}{\temptable}
\pgfplotstablemodifyeachcolumnelement{colnames}\of\temptabletransposed\as\cell{%
\edef\cell{\tablename}%
}
\firstrowfalse
\else
\pgfplotstableread{\tablename.txt}\temptable
\pgfplotstabletranspose[input colnames to=colnames]{\temptabletransposedcur}{\temptable}
\pgfplotstablemodifyeachcolumnelement{colnames}\of\temptabletransposedcur\as\cell{%
\edef\cell{\tablename}%
}
\pgfplotstablevertcat{\temptabletransposed}{\temptabletransposedcur}
\fi
}
\pgfplotstabletranspose[colnames from=colnames, input colnames to=]{#2}{\temptabletransposed}
}
\def\tr{\thisrow}
\mergetables{X, n1b1_f1, n1b2_f1, n1b3_f1, n1b4_f1}{\datatable}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ xlabel=$x$, ylabel=$y$]
\addplot table [y expr=(\tr{n1b1_f1}+\tr{n1b2_f1}-\tr{n1b3_f1})*-1]{\datatable};
\end{axis}
\end{tikzpicture}
\end{document}