无法在轴坐标系中生成和对齐循环框

无法在轴坐标系中生成和对齐循环框

我正在尝试在坐标系内生成一组框(使用循环)。这是我的 MWEe:

1型

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}

\begin{tikzpicture}[scale=1]
\begin{axis}[
  xmin=0,
  xmax=6,
  ymin=0,
  ymax=4,
  axis on top,
  xtick={1,2,3,4,5},
  ytick={1,2,3},
  yticklabels={A,B,C},
  xlabel={X axis},
  ylabel={Y axis},
  ]

  \foreach \x in {1,2,3,4,5}{
    \foreach \y in {1,2,3}{
      \filldraw[draw=black, fill=white] (\x,\y) rectangle ++(0.5cm,0.5cm);
    }
  }  
  
\end{axis}
\end{tikzpicture}
\end{document}

我收到错误:

! Undefined control sequence.
<argument> \x
,\y
l.24 \end{axis}

微波辐射计

我改变了方法并尝试:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}
\begin{tikzpicture}[scale=1]
  \foreach \x in {1,2,3,4,5}{
    \foreach \y in {1,2,3}{
      \filldraw[draw=black, fill=white] (\x,\y) rectangle ++(0.5cm,0.5cm);
    }
  }  
\begin{axis}[
  xmin=0,
  xmax=6,
  ymin=0,
  ymax=4,
  xtick={1,2,3,4,5},
  ytick={1,2,3},
  yticklabels={A,B,C},
  xlabel={X axis},
  ylabel={Y axis},
  ]
\end{axis}
\end{tikzpicture}
\end{document}

并得到输出:

图像

其中盒子没有与坐标系正确对齐。

为什么这些框无法继承 pgfplots 的坐标系?我该如何让它们工作?

答案1

我只想使用\addplot方块作为标记。使用/.list处理程序可以通过循环构建坐标列表,而无需使用全局宏。

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}
\begin{tikzpicture}[scale=1,
    add x/.code={\edef\tmp{\tmp(#1,\y)}},
    add y/.code={\edef\y{#1}\tikzset{add x/.list={1,...,3}}}]
  \edef\tmp{}  
  \tikzset{add y/.list={1,...,3}}
  
\begin{axis}[
  xmin=0,
  xmax=6,
  ymin=0,
  ymax=4,
  xtick={1,2,3,4,5},
  ytick={1,2,3},
  yticklabels={A,B,C},
  xlabel={X axis},
  ylabel={Y axis},
  ]
  \addplot[only marks,mark=square,mark size=3mm] coordinates{\tmp};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

为了使盒子与axis环境的坐标系对齐,你需要在axis环境内绘制它们(或者以某种方式获取Xaxis环境内部到环境外部)。 在环境内部axis,可以使用\coordinate (0.5,0.5);(不带单位)将坐标放置在相关的轴坐标处。

然而,一个缺点是\foreach循环在环境中的行为略有不同axis,您需要明确处理扩展顺序。这可以使用\edef\temp{\noexpand...}\temp以下 MWE 中所示的构造来实现:

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{document}
\begin{tikzpicture}[scale=1]
\begin{axis}[
  xmin=0,
  xmax=6,
  ymin=0,
  ymax=4,
  xtick={1,2,3,4,5},
  ytick={1,2,3},
  yticklabels={A,B,C},
  xlabel={X axis},
  ylabel={Y axis},
  ]
  \foreach \x in {1,2,3,4,5} {
    \foreach \y in {1,2,3} {
      \edef\mytemp{
        \noexpand\filldraw[draw=black, fill=white] (\x,\y) rectangle ++(0.5cm,0.5cm);
      }\mytemp
    }
  }  
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

这个奇怪的结构有什么用呢?让我们详细看看:

\edef\mytemp{
    \noexpand\filldraw[draw=black, fill=white] (\x,\y) rectangle ++(0.5cm,0.5cm);
}\mytemp

我们定义一个可扩展的宏\mytemp,其定义如下一对花括号中所述,然后在定义之后立即调用它。在定义中,我们确保首先将\x\y扩展为相关值,然后才\filldraw调用使用这两个宏的宏。这样,我们确保扩展顺序是正确的。


您可能希望矩形以相关轴坐标为中心。为此,您需要将左下角坐标向下和向左移动一半:

\filldraw[draw=black, fill=white] 
    ([shift={(-0.25cm,-0.25cm)}]\x,\y) rectangle ++(0.5cm,0.5cm);

或者您可以使用默认在中心对齐的节点:

\node[draw=black, fill=white, text width=0.5cm, text height=0.5cm, inner sep=0pt] 
    at (\x,\y) {};

相关内容