Trazar una cuadrícula con un subconjunto de cuadrados marcados usando pgfplots

Trazar una cuadrícula con un subconjunto de cuadrados marcados usando pgfplots

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}

ingrese la descripción de la imagen aquí


Edición 1:Lo logré, solo olvidé lo \expandafterde antes \csnamede 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}

Nueva salida de muestra (con geometryopción a3paper)

ingrese la descripción de la imagen aquí

información relacionada