Grade de desenho com cor aleatória no TikZ

Grade de desenho com cor aleatória no TikZ

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:

Minha tentativa.

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 noderecurso. À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 nodegeralmente 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 tikzdesenhos 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 sepque tenha o tamanho do seu nó. A seguir está a sua capacidade de posicionar o valor nodeem relação ao seu tamanho. Aqui anchorestá 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=centerpara anchor=east. Com anchor=centerele pega a coordenada central no nó e coloca na coordenada que você especifica. Com anchor=eastele 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 \definecolore não precisa se preocupar com isso. Neste caso o número deve estar entre 0 e 100. Mais adiante você precisa da \edefetapa para manter esse resultado. Há muita matemática acontecendo, tikzentão você precisa salvar a variável matemática temporariamente (e é por isso que \edefé necessário).

informação relacionada