在 TikZ 中使用随机颜色绘制网格

在 TikZ 中使用随机颜色绘制网格

我正在尝试在 TikZ 中绘制一个 10x10 的网格,如下所示:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1]
    \foreach \y in {0.05,0.15,...,0.95}
    \foreach \x in {0.05,0.15,...,0.95}
        \pgfmathparse{0.9*rnd+0.3}
        \definecolor{MyColor}{rgb}{\pgfmathresult,\pgfmathresult,\pgfmathresult}
        \node[fill=MyColor,minimum size=0.1] at (\x,\y) {}; 
    \draw[step=.1,help lines] (0,0) grid (1,1); 
    \draw[->] (0,1) -- (1.2,1);
    \draw[->] (0,1) -- (0,-0.2);
\end{tikzpicture}
\end{document}

这已经非常接近我想要的效果了,但是节点排列不正确。我做错了什么?以下是我的输出图像:

我的尝试

此外,由于我是 TikZ 的新手,请随意对代码进行评论,包括可读性、编码实践等。

答案1

您不应该总是使用该node功能。有时您需要节点的坐标,如果不需要,通常可以“手动”执行(代码更少)。

我在这里整理了 2 种方法,一种是更正了你的错误,另一种是不使用nodes。我更喜欢没有节点的那个,因为它画得更干净,但每个人都可以选择他们想要的任何风格!

没有node

\begin{tikzpicture}[scale=1]
  \foreach \y in {0.0,0.1,...,0.9} {
      \foreach \x in {0.0,0.1,...,0.9} {
          \pgfmathparse{0.9*rnd+0.3}
          \definecolor{MyColor}{rgb}{\pgfmathresult,\pgfmathresult,\pgfmathresult}
          \path[fill=MyColor] (\x,\y) rectangle ++(0.1,0.1); 
      }
  }
  \draw[step=.1,help lines] (0,0) grid (1,1); 
  \draw[->] (0,1) -- (1.2,1);
  \draw[->] (0,1) -- (0,-0.2);
\end{tikzpicture}

如您所见,只需绘制一个矩形并用您选择的颜色填充它。

固定代码

您需要确保的是位置正确,尺寸正确。Anode通常有一些与文本填充相关的空间。此空间是为了确保绘图与文本相比不会太紧,请比较以下两个tikz绘图:

\tikz \node[draw,inner sep=0pt,outer sep=0pt] {H};
\tikz \node[draw] {H};

因此,我添加了你不需要任何outer sep,但保留一个inner sep具有节点大小的 。接下来是你node根据其大小放置 的能力。这anchor是你的朋友,它基本上告诉节点是否应该放置在将节点锚定在节点内的坐标处的坐标处。例如,尝试更改为anchor=centeranchor=eastanchor=center采用节点中的中心坐标并放置在你指定的坐标处。anchor=east它采用节点的东点并放置在坐标处。在下面的例子中,它严格来说不是必需的,但它很好地说明了它的作用(它是非常有用)

\begin{tikzpicture}[scale=1]
  \foreach \y in {0.1,0.2,...,.9} {
      \foreach \x in {0.1,0.2,...,.9} {
          \pgfmathparse{0.9*rnd+0.3}
          \definecolor{MyColor}{rgb}{\pgfmathresult,\pgfmathresult,\pgfmathresult}
          \node[fill=MyColor,inner sep=0.1cm,outer sep=0pt,anchor=center] at (\x,\y) {}; 
      }
  }
  \draw[step=.1,help lines] (0,0) grid (1,1); 
  \draw[->] (0,1) -- (1.2,1);
  \draw[->] (0,1) -- (0,-0.2);
\end{tikzpicture}

希望这能为您指明正确的方向。

颜色tikz

另外,当定义新颜色时,您可以跳过定义颜色的步骤:

\pgfmathparse{70*rnd+30}
\edef\tmp{\pgfmathresult}
\node[fill=white!\tmp!black] ... 

在这种情况下,您可以跳过\definecolor,并且不必担心。在这种情况下,数字应该在 0 到 100 之间。此外,您需要 step\edef来保留该结果。这里有很多数学运算,tikz因此您需要临时保存数学变量(这就是\edef需要的原因。)

相关内容