在 foreach 节点中使用多行

在 foreach 节点中使用多行

\foreach我打算用一个在图表中绘制点并在侧面标记的单一工具制作 TikZ 图表。我\foreach把所有标签都画在了彼此的顶部。有没有简单的方法可以解决这个问题?

PGFplots 是否是完成这项任务的更好选择?

\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}
\draw[<->] (3,0) -- (0,0) -- (0,3);
\foreach \x/\y/\col/\char in {
1/1/black/A,
2/2/red/B
}
{
\fill[color=\col] (\x,\y) circle [radius=0.1];
\node[align=left] at (3,3) {
\tikz\fill[color=\col] (0,0) circle [radius=0.1]; \char \\
};
}
\end{tikzpicture}
\end{document}

奇数输出

我想要一个“侧面板”来解释每种颜色的含义,但我没有找到干净的输入。

\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}
\draw[<->] (3,0) -- (0,0) -- (0,3);
\foreach \x/\y/\col in {
1/1/black/A,
2/2/red/B
}
{
\fill[color=\col] (\x,\y) circle [radius= 0.1];
}
\node[align=left] at (3,3) {
\tikz\fill[color=black] (0,0) circle [radius=0.1]; A \\
\tikz\fill[color=red] (0,0) circle [radius=0.1]; B \\
};
\end{tikzpicture}
\end{document}

预期输出

答案1

问题在于您在 处绘制了所有节点(3,3),因此它们都绘制在彼此的顶部(您也可以通过圆圈(3,3)本身看到这种情况)。


pgfplots 解决方案

有点过头了,但是因为常规TikZ解决方案已经涵盖,所以我还是会添加它。

pgfplots在绘制散点图时,可以利用每个数据点的元信息。我们利用这些元信息将每个数据点分配到一个类,每个类都有自己的样式。

\documentclass[margin=5mm,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            xmin=0.5,
            xmax=2.5,
            legend pos=outer north east,
        ]

        \addplot[
            only marks,
            scatter,
            point meta=explicit symbolic,
            scatter/classes={
                A={mark=triangle*,blue},%
                B={mark=square*,red}},
        ]
            table[x=x,y=y,meta=char] {%
            x y char 
            1 1 A
            2 2 B
        };
        \legend{A,B};
    \end{axis}
\end{tikzpicture}
\end{document}

结果:pgfplots 结果

请参阅pgfplots第 254f 页的手册以了解图例定位,第 181 页及后续页面了解不同的mark样式,第 112 页及后续页面了解有关 的一些信息scatter/classes


旧解决方案

编辑:我最初误解了这个问题,但将其留在这里以供后人参考。

这是您想要的结果(或类似的结果)吗?

\documentclass[margin=5mm,tikz]{standalone}

\begin{document}
\begin{tikzpicture}
    \draw[<->] (3,0) -- (0,0) -- (0,3);
    \foreach \x/\y/\col/\char in {
        1/1/black/A,
        2/2/red/B,
        3/3/red/C
    }
    {
        \fill[color=\col] (\x,\y) circle [radius=0.1];
        \node[xshift=1em] at (\x,\y) {\char};
    }
\end{tikzpicture}
\end{document}

结果

我希望我理解了你的意图。如果没有,请告诉我。pgfplots是的,你可以使用它,但这不是绝对必要的。

答案2

对于这种简单的情况,实际上不需要 PGFplots。

\documentclass[tikz,border=5pt]{standalone}
\begin{document}

\begin{tikzpicture}
\draw[<->] (3,0) -- (0,0) -- (0,3);

\foreach \x/\y/\col/\char in {1/1/black/A, 2/2/red/B} {
  \fill[color=\col] (\x,\y) circle [radius=2pt];
  \fill[color=\col,yshift=-\x em] (3,3)node[right]{\footnotesize\char} circle [radius=2pt];
}

\end{tikzpicture}

\end{document}

[1]:https://i.stack.imgur.com/hlg

相关内容