我将数据存储在名为 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
以相同的方式编写。我选择了简单的方法,因此您无法访问每个点的单独x
和y
坐标,因为 lua 表中的每个元素Ca
和Cb
包含文件的一行,例如,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}