pgfplots を使用して、マークされた正方形のサブセットを含む正方形グリッドをプロットします。

pgfplots を使用して、マークされた正方形のサブセットを含む正方形グリッドをプロットします。

最近、pgfplots を発見し、このパッケージの機能に感銘を受けました。ただし、pgfplots を使用して便利に定義する方法がわからないプロットが 1 つあります。

基本的に、マークされた正方形のサブセットを含む正方形のグリッドをプロットしたいと思います (申し訳ありませんが、新規ユーザーとして画像を投稿することはできません)。閉じた図形が描画されるマニュアルの例に従う/変更できることはわかっています。

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

しかし、私は疑問に思う - そのようなプロットを、正方形の整数座標各正方形の 4 つの正確な角のリストではなく、マークするのですか?

答え1

スタックとスラブのどちらが必要か分からなかったので、両方用意しました。

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

ここに画像の説明を入力してください


編集1:なんとかできました。ただ、昨日\expandafterのことを忘れていました\csname

更新しました\getslab

\newcommand{\getslab}[3]{\expandafter\csname check#1\endcsname(#2,#3)\trimspace\cachedata}

更新しました\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);}
                {}
        }
    }
}

新しいサンプル入力

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

新しいサンプル出力(geometryオプション付きa3paper

ここに画像の説明を入力してください

関連情報