我有一个包含如下数据的网格文件:
5
4
0 0 0 0 0
0 1 1 2 0
0 2 2 1 0
3 0 0 3 1
其中 5 是网格的宽度,4 是高度,网格中的每个数字对应一个海拔。如果需要,我可以剪掉 5 和 4。
我想将其显示为 LaTeX 中的彩色方块网格,并在每个方块的中心印上数字。
我知道如何使用 TikZ 绘制矩形和标签,所以我想我可以搞清楚这部分。但读取数据(并将数字转换为颜色)让我很困惑。有什么想法可以告诉我该怎么做吗?
答案1
Lualatex 解决方案:
\begin{tikzpicture}
\directlua{grid = readGridFile("example.dat");
plot(grid)}
\end{tikzpicture}
\end{document}
现在是整个文档。请注意,我使用包filecontents
将排版示例所需的所有文件包含在单个源中。您可以filecontents*
在第一次编译后安全地删除这些环境,因为您将拥有所需的文件example.dat
和gridlua.lua
。
\documentclass{standalone}
\usepackage{luacode}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents*}{gridlua.lua}
function readGridFile(filename)
local f, columns, rows
local grid={}
f = io.open(filename, "r")
columns = tonumber( f:read("*line") ) -- To convert it to int
rows = tonumber( f:read("*line") )
for i = 1, rows, 1 do
local row = {}
line = f:read("*line")
for data in line:gmatch("%w+") do table.insert(row, data) end
table.insert(grid, row)
end
return grid
end
function plot(grid)
for i,row in ipairs(grid) do
for j, data in ipairs(row) do
tex.print(string.format(
"\\node[data, style%d] at (%d,%d) (data%d%d) {%d};",
data, j, -i, j, i, data))
end
tex.sprint("\\par")
end
end
\end{filecontents*}
\begin{filecontents*}{example.dat}
5
4
0 0 0 0 0
0 1 1 2 0
0 2 2 1 0
3 0 0 3 1
\end{filecontents*}
\directlua{dofile("gridlua.lua")}
\begin{document}
\tikzset{
data/.style = {draw, rectangle, inner sep=0pt, minimum width=1cm,
minimum height = 1cm},
style0/.style = { fill=white },
style1/.style = { fill=yellow!60 },
style2/.style = { fill=orange!60 },
style3/.style = { fill=red!80 },
}
\begin{tikzpicture}
\directlua{grid = readGridFile("example.dat");
plot(grid)}
% You can even point to some particular datum:
% \draw[<-, shorten <=-5pt] (data42) to[bend left] +(3,2) node[right]{See here};
\end{tikzpicture}
\end{document}
lua 代码生成 tikz 命令来创建图形网格,并为每个节点分配一个自动名称,即dataXY
。例如,左上角的 0 将被命名为data11
,左下角的 1 将被命名为data54
。