我有一个文件 data.dat,其中包含以下几行:
-1.200000 0.000000
-1.200000 -0.728000
-0.728000 -0.728000
-0.728000 0.614172
0.614172 0.614172
0.614172 1.231670
它存储了一组具有x
和y
坐标的点。我随后想绘制这个点列表,每两个点(或每个点,也可以)带有箭头,如下所示(但使用箭头而不是 mark=*):
\begin{document}
\begin{tikzpicture}
\draw[mark=*,mark indices={2,4,...,8}] plot file {data.dat};
\end{tikzpicture}
\end{document}
看起来没有像箭头一样的标记:更好的解决方案是使用foreach
读取数据文件的循环吗?
答案1
这里有一个建议,使用 Lua 来编写多个\draw
s,因此必须使用 进行编译lualatex
。我借用了以下文件读取代码:https://stackoverflow.com/questions/16038236/store-in-2d-array-the-contents-of-file-lua
箭头之间的角存在问题,因为线被绘制为单独的路径,因此它们没有正确连接。对于这种特定情况,一种破解方法是[shorten >=-0.5\\pgflinewidth]
在子句draw
中添加else
。
\documentclass[border=2mm]{standalone}
\usepackage{tikz,luacode,filecontents}
\begin{filecontents*}{data.dat}
-1.200000 0.000000
-1.200000 -0.728000
-0.728000 -0.728000
-0.728000 0.614172
0.614172 0.614172
0.614172 1.231670
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{luacode}
local mt = {} -- create the matrix
for line in io.lines'data.dat' do
local new_row = {}
for n in line:gmatch'%S+' do
table.insert(new_row, tonumber(n))
end
if #new_row > 0 then
table.insert(mt, new_row)
end
endrows = \#mt
for i=1,endrows-1 do
if i % 2 == 1 then
tex.sprint("\\draw [-latex] (", mt[i][1], ",", mt[i][2] , ") -- (", mt[i+1][1], ",", mt[i+1][2], ");")
else
tex.sprint("\\draw (", mt[i][1], ",", mt[i][2] , ") -- (", mt[i+1][1], ",", mt[i+1][2], ");")
end
end
end
\end{luacode}
\end{tikzpicture}
\begin{tikzpicture}
\draw[mark=*,mark indices={2,4,...,8}] plot file {data.dat};
\end{tikzpicture}
\end{document}