我在一个文件夹中有data1.csv
、data2.csv
和。data3.csv
我用pythontex
从 1 到 3 中随机选择一个数字。
\begin{pycode}
list = random.sample(range(1, 3), 3)
select = list[0]
\end{pycode}
然后在文档中我尝试使用命令
\addplot table [] {data\py{select}.csv};
但它不起作用。
我们如何才能读取像这样随机选择的文件data#.csv
名#
?
答案1
这是一个扩展问题。文件参数必须完全可扩展,因此在使用之前,您需要有一个已扩展随机的宏或数字\addplot
。例如,您可以使用random
:
% Somewhere in the document preamble:
\input{random.tex}
\newcount\randomselect
并尝试类似
\setrannum{\randomselect}{1}{3}
\edef\randomdata{data\the\randomselect.csv}
之前某处\addplot
。为了能够使用
\addplot table [] {\randomdata}
这是一个简短的例子:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{filecontents*}{data1.csv}
1 1
5 1
\end{filecontents*}
\begin{filecontents*}{data2.csv}
1 1
5 2
\end{filecontents*}
\begin{filecontents*}{data3.csv}
1 1
5 3
\end{filecontents*}
\input{random}
\newcount\randomselect
\newcommand*{\randomdata}{NotInitialized}
\newcommand*{\newrandomdata}[2]{%
\setrannum{\randomselect}{#1}{#2}%
\edef\randomdata{data\the\randomselect.csv}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\newrandomdata{1}{3}%
\addplot [red] table {\randomdata};
\newrandomdata{1}{3}%
\addplot [blue] table {\randomdata};
\newrandomdata{1}{3}%
\addplot [green] table {\randomdata};
\legend{first,second,third}
\end{axis}
\end{tikzpicture}
\end{document}
另一个非常好的建议是使用序列expl3
。这样你就不需要有数字文件名了:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{filecontents*}{dataA.csv}
1 1
5 1
\end{filecontents*}
\begin{filecontents*}{dataX.csv}
1 1
5 2
\end{filecontents*}
\begin{filecontents*}{data3.csv}
1 1
5 3
\end{filecontents*}
\ExplSyntaxOn
\seq_new:N \my_data_files_seq
\seq_set_from_clist:Nn \my_data_file_seq { dataA.csv, dataX.csv, data3.csv }
\newcommand*{\randomdata}{\seq_rand_item:N \my_data_file_seq}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot [red] table {\randomdata};
\addplot [blue] table {\randomdata};
\addplot [green] table {\randomdata};
\legend{first,second,third}
\end{axis}
\end{tikzpicture}
\end{document}
但是,对于这两个建议,不要指望只有三个数字就能产生很大的随机性!真正的随机性需要很大的范围。因此,这个例子有时显示三行,有时只显示两行或一行。有时多次运行这个例子会显示相同的结果。