我使用以下代码绘制了一些块:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{figure}[h!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}[text centered]
\foreach \x in {-8, -7.4, -6.8, -6.2}
\foreach \y in {1.8, 1.2, ..., -2.4}
\draw (\x,\y) rectangle (\x+0.5,\y+0.5);
\end{tikzpicture}
}%
\end{figure}
\end{document}
当我逐个绘制它们时,我可以为每个块填充不同的颜色,但是当我用这个批次绘制它们时,我该如何填充?例如,我只想用红色填充其中的一些,如下图所示。(我可以将每个块命名为一个节点,然后可以通过选择节点名称来填充吗?)
答案1
您可以命名坐标,然后事后为其着色(使用背景层)。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{figure}[h!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}[text centered]
% use layers to add shading "under" the rectangles
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\foreach[count=\ordx from 1] \x in {-8, -7.4, -6.8, -6.2}
\foreach[count=\ordy from 1] \y in {1.8, 1.2, ..., -2.4}
% name the top left and bottom right coordinate
\draw (\x,\y) coordinate(TL-\ordx-\ordy) rectangle (\x+0.5,\y+0.5) coordinate(BR-\ordx-\ordy);
% go on the background layer
\begin{pgfonlayer}{background}
% you can use your coordinates here; lot of possibilities
% if you add the calc tikzlibrary
\fill[red!20] (TL-1-1) rectangle (BR-1-1);
\fill[green!20] (TL-3-1) rectangle (BR-3-1);
\fill[red!70] (TL-4-4) rectangle (BR-4-4);
\end{pgfonlayer}
\end{tikzpicture}
}%
\end{figure}
\end{document}
这里的技巧是,将左上角的坐标命名为y,(TL-x-y)
将右下角的坐标命名为相应的 y (BR-x-y)
,然后使用它们在背景层中添加填充。
请注意,节点名称仅在相同的中有效tikzpicture
,除非您使用选项remember picture
(但您必须注意拉伸和调整大小等事情,这并不容易管理)
答案2
你可以使用矩阵
\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[]
\matrix[matrix of nodes,nodes in empty cells,row sep=1mm,column sep=1mm,
nodes={minimum size=0.5cm,draw,anchor=center,outer sep=0},
row 5 column 2/.style={nodes={fill=blue}},
column 1/.style={nodes={fill=red!50}},
row 3 column 1/.style={nodes={shade,right color=yellow}}
]{&&&\\&&&\\&&&\\&&&\\&&&\\&&&\\&&&\\};
\end{tikzpicture}
\end{document}
答案3
一种方法(相当冗长)是将两个循环扩展为一个循环,但循环三个变量(坐标和颜色):
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{figure}[h!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}[text centered]
\foreach \i / \j / \c in
{0/6/red, 1/6/white, 2/6/white, 3/6/white,
0/5/white, 1/5/white, 2/5/white, 3/5/white,
0/4/white, 1/4/white, 2/4/white, 3/4/white,
0/3/white, 1/3/white, 2/3/red, 3/3/white,
0/2/white, 1/2/white, 2/2/white, 3/2/white,
0/1/white, 1/1/red, 2/1/white, 3/1/red,
0/0/white, 1/0/white, 2/0/white, 3/0/white}
\filldraw[fill=\c] (-8+0.6*\i,1.8+0.6*\j) rectangle (-7.5+0.6*\i,1.3+0.6*\j);
\end{tikzpicture}
}%
\end{figure}
\end{document}
或者,您可以将属性存储到单独的文件中(您可以通过编程方式生成它),然后执行以下操作(该想法取自使用 \foreach 从文件中读取要迭代的数据):
\begin{filecontents*}{\jobname.dat}
0/6/red, 1/6/white, 2/6/white, 3/6/white,
0/5/white, 1/5/white, 2/5/white, 3/5/white,
0/4/white, 1/4/white, 2/4/white, 3/4/white,
0/3/white, 1/3/white, 2/3/red, 3/3/white,
0/2/white, 1/2/white, 2/2/white, 3/2/white,
0/1/white, 1/1/red, 2/1/white, 3/1/red,
0/0/white, 1/0/white, 2/0/white, 3/0/white
\end{filecontents*}
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{catchfile}
\newcommand\loaddata[1]{\CatchFileDef\loadeddata{#1}{\endlinechar=-1}}
\begin{document}
\begin{figure}[h!]
\centering
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}[text centered]
\loaddata{\jobname.dat}
\foreach \i / \j / \c in \loadeddata
\filldraw[fill=\c] (-8+0.6*\i,1.8+0.6*\j) rectangle (-7.5+0.6*\i,1.3+0.6*\j);
\end{tikzpicture}
}%
\end{figure}
\end{document}
该文件\jobname.dat
仅为方便起见而包含在主文件中。