我正在尝试在坐标系内生成一组框(使用循环)。这是我的 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
环境内绘制它们(或者以某种方式获取X和是从axis
环境内部到环境外部)。 在环境内部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) {};