
Я пытаюсь нарисовать сетку 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
она нужна).