批量绘制后填充颜色

批量绘制后填充颜色

我使用以下代码绘制了一些块:

\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仅为方便起见而包含在主文件中。

相关内容