Рисование сетки случайным цветом в TikZ

Рисование сетки случайным цветом в TikZ

Я пытаюсь нарисовать сетку 10x10 в TikZ вот так:

\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}

Как вы видите, вам просто нужно нарисовать прямоугольник и залить его цветом по вашему выбору.

Фиксированный код

Вам нужно убедиться в правильном размещении и правильном размере. nodeОбычно есть некоторое пространство, связанное с заполнением текста. Это пространство необходимо для того, чтобы рисунок не был слишком плотным по сравнению с текстом, сравните следующие два tikzрисунка:

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

Поэтому я добавил, что вам не нужны никакие outer sep, но сохранил , inner sepкоторый имеет размер вашего узла. Далее следует ваша способность размещать nodeотносительно его размера. Вот anchorваш друг, он в основном сообщает, следует ли размещать узел в координате, привязывая узел к координате внутри узла. Попробуйте, например, изменить anchor=centerна anchor=east. С anchor=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. Более того, вам нужен шаг, \edefчтобы сохранить этот результат. Там происходит много математики, tikzпоэтому вам нужно временно сохранить математическую переменную (вот почему \edefона нужна).

Связанный контент