
Estou tentando desenhar uma grade 10x10 no TikZ assim:
\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}
O que já está bem próximo do que eu tinha em mente, mas os nós não se alinham corretamente. O que estou fazendo de errado? Aqui está uma imagem da minha saída:
.
Além disso, como sou novo no TikZ, fique à vontade para comentar sobre o código, em termos de legibilidade, práticas de codificação e assim por diante.
Responder1
Você nem sempre deve usar o node
recurso. Às vezes você precisa das coordenadas do nó; caso contrário, muitas vezes pode valer a pena fazê-lo "manualmente" (menos código).
Compilei aqui 2 métodos, um onde o seu é corrigido e outro sem o uso de nodes
. Prefiro aquele sem nós porque tem um desenho mais clean, mas cada um pode preferir o estilo que quiser!
Semnode
\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}
Como você pode ver basta desenhar um retângulo e preenchê-lo com a cor de sua escolha.
Código fixo
O que você precisa garantir é o posicionamento correto e o tamanho correto. A node
geralmente possui algum espaço associado ao preenchimento do texto. Este espaço é para garantir um desenho não muito apertado em relação ao texto, compare os dois tikz
desenhos a seguir:
\tikz \node[draw,inner sep=0pt,outer sep=0pt] {H};
\tikz \node[draw] {H};
Portanto acrescentei que você não quer nenhum outer sep
, mas mantive um inner sep
que tenha o tamanho do seu nó. A seguir está a sua capacidade de posicionar o valor node
em relação ao seu tamanho. Aqui anchor
está o seu amigo, basicamente informa se o nó deve ser colocado na coordenada que ancora o nó na coordenada dentro do nó. Experimente, por exemplo, e mude anchor=center
para anchor=east
. Com anchor=center
ele pega a coordenada central no nó e coloca na coordenada que você especifica. Com anchor=east
ele pega o ponto leste do nó e coloca na coordenada. Não é estritamente necessário no exemplo abaixo, mas dá uma boa ideia do que faz (e éMUITOútil)
\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}
Espero que isso o leve na direção correta.
Cores emtikz
Além disso, ao definir novas cores, você pode pular uma etapa de definição de cores:
\pgfmathparse{70*rnd+30}
\edef\tmp{\pgfmathresult}
\node[fill=white!\tmp!black] ...
Neste caso você pula o \definecolor
e não precisa se preocupar com isso. Neste caso o número deve estar entre 0 e 100. Mais adiante você precisa da \edef
etapa para manter esse resultado. Há muita matemática acontecendo, tikz
então você precisa salvar a variável matemática temporariamente (e é por isso que \edef
é necessário).