Ich habe vor Kurzem pgfplots entdeckt und bin von den Fähigkeiten dieses Pakets beeindruckt. Es gibt jedoch einen Diagrammtyp, bei dem ich nicht weiß, wie ich ihn mit pgfplots bequem definieren kann.
Grundsätzlich möchte ich ein quadratisches Raster mit einer markierten Teilmenge von Quadraten zeichnen (es tut mir leid, als neuer Benutzer darf ich keine Bilder posten). Mir ist bewusst, dass ich dem Beispiel aus dem Handbuch folgen/es ändern kann, in dem eine geschlossene Form gezeichnet wird:
% 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}
Aber ich frage mich - ist es möglich, eine solche Handlung zu definieren, indem man nur dieganzzahlige Koordinaten von Quadratenzu markieren, anstatt eine Liste mit den vier genauen Ecken jedes Quadrats?
Antwort1
Ich war nicht sicher, ob Sie Stapel oder Platten wollten, also hier beides:
\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}
Bearbeitung 1:Ich habe es geschafft, habe nur das \expandafter
Vorgestern vergessen \csname
.
Aktualisiert\getslab
\newcommand{\getslab}[3]{\expandafter\csname check#1\endcsname(#2,#3)\trimspace\cachedata}
Aktualisiert\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);}
{}
}
}
}
Neue Beispieleingabe
\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}