
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:
.
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 node
funció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 node
suele 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 tikz
dibujos 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 sep
que tenga el tamaño de su nodo. Lo siguiente es tu capacidad para colocarlo node
con respecto a su tamaño. Aquí anchor
está 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=center
a 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 \edef
paso para mantener ese resultado. Están sucediendo muchas matemáticas, tikz
por lo que debe guardar la variable matemática temporalmente (que es la razón por la que \edef
es necesaria).