Recientemente descubrí pgfplots y estoy impresionado por las capacidades de este paquete. Sin embargo, hay un tipo de gráficos que no sé cómo definir convenientemente usando pgfplots.
Básicamente, me gustaría trazar una cuadrícula con un subconjunto de cuadrados marcados (lo siento, como usuario nuevo no puedo publicar imágenes). Soy consciente de que puedo seguir/modificar el ejemplo del manual en el que se dibuja una forma cerrada:
% Preamble: \pgfplotsset{width=7cm,compat=1.6}
\begin{tikzpicture}
\begin{axis}
\addplot+[fill] coordinates
{(0,1) (1,2) (0,3) (-1,2)} --cycle;
\end{axis}
\end{tikzpicture}
Pero me pregunto: ¿es posible definir tal trama pasando sólo por elcoordenadas enteras de cuadradospara marcar, en lugar de listas de cuatro esquinas precisas de cada cuadrado?
Respuesta1
No estaba seguro de si querías pilas o losas, así que aquí tienes ambas:
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{arrayjobx}
\usepackage{trimspaces}
\usepackage{xifthen}
\makeatletter
\def\trimspace#1{\trim@spaces@in{#1}}
\makeatother
\newcommand{\getslab}[2]{\checkdrawsquares(#1,#2)\trimspace\cachedata}
\newcommand{\drawstacks}[3]% fillheights, baroptions, gridoptions
{ \draw[#3] (0,0) grid (\gridwidth,\gridheight);
\foreach \x [count=\c] in {#1}
{ \fill[#2] (\c-1,0) rectangle (\c,\x);
}
}
\newcommand{\drawslabs}[3]% dataarray, slaboptions, gridoptions
{ \draw[#3] (0,0) grid (\gridwidth,\gridheight);
\foreach \x in {1,...,\gridwidth}
{ \foreach \y in {1,...,\gridheight}
{ \pgfmathtruncatemacro{\colnum}{\x}
\pgfmathtruncatemacro{\rownum}{\gridheight+1-\y}
\getslab{\rownum}{\colnum}
\ifthenelse{\cachedata>0}
{\fill[#2] (\x-1,\y-1) rectangle (\x,\y);}
{}
}
}
}
\begin{document}
\pgfmathtruncatemacro{\gridwidth}{13}
\pgfmathtruncatemacro{\gridheight}{7}
\newarray\drawsquares
\readarray{drawsquares}{%
1 & 1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 1 &%
0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 &%
1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 &%
1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 &%
0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 1 & 1 & 1}
\dataheight=\gridwidth%
\begin{tikzpicture}
\drawstacks{1,7,5,0,3,0,0,2,3,4,6,4,7}{red!50!gray,fill opacity=0.5,draw=red!50!gray,thick}{gray,densely dashed}
\end{tikzpicture}
\begin{tikzpicture}
\drawslabs{drawsquares}{red!50!gray,fill opacity=0.5,draw=red!50!gray,thick}{gray,densely dashed}{red}{gray}
\end{tikzpicture}
\end{document}
Edición 1:Lo logré, solo olvidé lo \expandafter
de antes \csname
de ayer.
Actualizado\getslab
\newcommand{\getslab}[3]{\expandafter\csname check#1\endcsname(#2,#3)\trimspace\cachedata}
Actualizado\drawslabs
\newcommand{\drawslabs}[3]% arraname, slaboptions, gridoptions
{ \draw[#3] (0,0) grid (\gridwidth,\gridheight);
\foreach \x in {1,...,\gridwidth}
{ \foreach \y in {1,...,\gridheight}
{ \pgfmathtruncatemacro{\colnum}{\x}
\pgfmathtruncatemacro{\rownum}{\gridheight+1-\y}
\getslab{#1}{\rownum}{\colnum}
\ifthenelse{\cachedata>0}
{\fill[#2] (\x-1,\y-1) rectangle (\x,\y);}
{}
}
}
}
Nueva entrada de muestra
\pgfmathtruncatemacro{\gridwidth}{13}
\pgfmathtruncatemacro{\gridheight}{7}
\newarray\drawsquares
\readarray{drawsquares}{%
1 & 1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 1 &%
0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 &%
1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 &%
1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 &%
0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 1 & 1 & 1}
\dataheight=\gridwidth%
\begin{tikzpicture}
\drawstacks{1,7,5,0,3,0,0,2,3,4,6,4,7}{red!50!gray,fill opacity=0.5,draw=red!50!gray,thick}{gray,densely dashed}
\end{tikzpicture}
\begin{tikzpicture}
\drawslabs{drawsquares}{red!50!gray,fill opacity=0.5,draw=red!50!gray,thick}{gray,densely dashed}{red}{gray}
\end{tikzpicture}
\delarray\drawsquares% Deleting the old array; don't reuse names of deleted arrays!
% define a "new array" by just interchanging width and height
\pgfmathtruncatemacro{\gridwidth}{7}% changed from 13 to 7
\pgfmathtruncatemacro{\gridheight}{13}% changed from 7 to 13
\newarray\verticalarray% new name
\readarray{verticalarray}{%
1 & 1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 1 &%
0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 &%
1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 &%
1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 &%
1 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 &%
0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 1 & 1 & 1}
\dataheight=\gridwidth% similar array as before, but this time interpreted as 7x13 instead of 13x7
\begin{tikzpicture}
\drawslabs{verticalarray}{red!50!gray,fill opacity=0.5,draw=red!50!gray,thick}{gray,densely dashed}{red}{gray}
\end{tikzpicture}