Tikz 中 \foreach 中文件中的数据作为列表

Tikz 中 \foreach 中文件中的数据作为列表

我将数据存储在名为 x.dat 和 y.dat 的文件中。文件中有两列,每行代表一个点。我在开始时绘制了这些点。但后来我想要一些从 x 点到 y 点的箭头。所以我需要对这些点进行 foreach。但这些点的存储方式无法通过 foreach 语句处理。

我怎样才能让 foreach 语句遍历文件中的点,而不更改文件?

\draw plot [only marks, mark=*, mark options={fill=red, scale=0.3}]
    file {x.dat};
\foreach \x  in file {x.dat}
    \foreach \y in file {y.dat}
    {
        \draw [->] \x -- \y;
    }

答案1

这是基于 Torbjørn 的代码,但在这里我尝试使用pgfplotstable。我不是这个包的专家,也许可以使用一些有用的宏来\xA直接读取\yA

\documentclass{scrartcl}
\usepackage{pgfplotstable,tikz,filecontents}

\begin{document} 
  \begin{filecontents*}{coord1.dat}
% x   y
0    0
1    1
2    2
\end{filecontents*}
\begin{filecontents*}{coord2.dat}
%  x   y
0    1
1    2
2    3
\end{filecontents*}
  \pgfplotstableread{coord1.dat}{\firsttable}   
  \pgfplotstableread{coord2.dat}{\secodtable} 
  \pgfplotstablegetrowsof{coord1.dat}
  \pgfmathsetmacro{\rows}{\pgfplotsretval-1}      
\begin{tikzpicture}

\foreach \i in {0,...,\rows}{%
  \pgfplotstablegetelem{\i}{[index] 0}\of{\firsttable} 
  \let\xA\pgfplotsretval 
  \pgfplotstablegetelem{\i}{[index] 1}\of{\firsttable} 
  \let\yA\pgfplotsretval     
  \foreach \j in {0,...,\rows}{%
    \pgfplotstablegetelem{\j}{[index] 0}\of{\secodtable} 
    \let\xB\pgfplotsretval 
    \pgfplotstablegetelem{\j}{[index] 1}\of{\secodtable} 
    \let\yB\pgfplotsretval        
    \draw [-latex] (\xA,\yA) node[below]{\xA,\yA} -- (\xB,\yB) node[above]{\xB,\yB};
  }%
 }%   
\end{tikzpicture}
\end{document} 

在此处输入图片描述

答案2

解决方案 #1 – datatool

如果我理解错了,你可以使用datatool,类似于通过文件中的数据参数绘制不同的 tikz 形状

带有坐标的文件由filecontents*环境创建。

\documentclass[a4paper]{scrartcl}
\usepackage{datatool,tikz,filecontents}
\begin{filecontents*}{coord1.dat}
x,y
0,0
1,1
2,2
\end{filecontents*}
\begin{filecontents*}{coord2.dat}
x,y
0,1
1,2
2,3
\end{filecontents*}
\DTLloaddb[noheader=false]{coordinates1}{coord1.dat}
\DTLloaddb[noheader=false]{coordinates2}{coord2.dat}

\begin{document}
\begin{tikzpicture}
\DTLforeach*{coordinates1}{\xA=x, \yA=y}{%
  \DTLforeach*{coordinates2}{\xB=x, \yB=y}{
     \draw [-latex] (\xA,\yA) node[below]{\xA,\yA} -- (\xB,\yB) node[above]{\xB,\yB};}}
\end{tikzpicture}
\end{document}

生产

在此处输入图片描述

解决方案#2–Lua

下面的代码可能有点糟糕,我不知道。它使用 Lua 代码读取文件并循环遍历坐标,因此必须使用 进行编译lualatex。使用了相同的文件coord1.dat和,并coord2.dat以相同的方式编写。我选择了简单的方法,因此您无法访问每个点的单独xy坐标,因为 lua 表中的每个元素CaCb包含文件的一行,例如1,1。而且,如果两个坐标列表的长度不同,那么这将不起作用。

输出与上面相同。

\documentclass{scrartcl}
\usepackage{tikz,luacode,filecontents}
\begin{filecontents*}{coord1.dat}
x,y
0,0
1,1
2,2
\end{filecontents*}
\begin{filecontents*}{coord2.dat}
x,y
0,1
1,2
2,3
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{luacode}
c1 = io.open("./coord1.dat","r")
c2 = io.open("./coord2.dat","r")
local count = 1
Ca = {}
Cb = {}
while true do
  local line1 = c1:read()
  local line2 = c2:read()
  if line1 == nil then break end
  Ca[count], Cb[count] = line1, line2
  count = count + 1
end
c1:close()
c2:close()
rows = \#Ca
for i=2,rows do
  for j=2,rows do
    tex.sprint("\\draw [-latex] (", Ca[i], ")node[below]{", Ca[i], "} -- (", Cb[j], ") node[above] {", Cb[j], "};")
  end
end
\end{luacode}
\end{tikzpicture}
\end{document}

相关内容