Dibujar cuadrícula con color aleatorio en TikZ

Dibujar cuadrícula con color aleatorio en TikZ

Estoy intentando dibujar una cuadrícula de 10x10 en TikZ así:

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

Lo cual ya se acerca bastante a lo que tenía en mente, pero los nodos no se alinean correctamente. ¿Qué estoy haciendo mal? Aquí hay una imagen de mi salida:

Mi intento.

Además, como soy nuevo en TikZ, no dudes en comentar sobre el código, en términos de legibilidad, prácticas de codificación, etc.

Respuesta1

No siempre debes utilizar la nodefunción. A veces necesitas las coordenadas del nodo, si no las necesitas, a menudo puede resultar rentable hacerlo "manualmente" (menos código).

Aquí he compilado 2 métodos, uno donde el tuyo está corregido y el otro sin el uso de nodes. Prefiero el que no tiene nodos porque es más limpio, ¡pero cada uno puede preferir el estilo que quiera!

Sinnode

\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 puedes ver, simplemente dibuja un rectángulo y rellénalo con el color que elijas.

código fijo

Lo que debe asegurarse es la ubicación correcta y el tamaño correcto. A nodesuele tener algún espacio asociado al relleno del texto. Este espacio es para garantizar que el dibujo no sea demasiado ajustado en comparación con el texto, compare los dos tikzdibujos siguientes:

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

Por lo tanto, agregué que no desea ninguno outer sep, pero conservé uno inner sepque tenga el tamaño de su nodo. Lo siguiente es tu capacidad para colocarlo nodecon respecto a su tamaño. Aquí anchorestá tu amigo, básicamente dice si el nodo debe colocarse en la coordenada que ancla el nodo en la coordenada dentro del nodo. Pruebe, por ejemplo, y cambie anchor=centera anchor=east. Con anchor=centerél, toma la coordenada central en el nodo y colócala en la coordenada que especifiques. Con anchor=eastél se toma el punto este del nodo y se coloca en la coordenada. En el siguiente ejemplo no es estrictamente necesario, pero da una buena idea de lo que hace (y esMUYú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 esto te lleve en la dirección correcta.

Colores entikz

Además, al definir nuevos colores, puede omitir un paso de definición de color:

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

En este caso te saltas el \definecolor, y no tienes que preocuparte por eso. En este caso, el número debe estar entre 0 y 100. Además, necesita el \edefpaso para mantener ese resultado. Están sucediendo muchas matemáticas, tikzpor lo que debe guardar la variable matemática temporalmente (que es la razón por la que \edefes necesaria).

información relacionada