使用不同颜色的实心圆创建矩形排列

使用不同颜色的实心圆创建矩形排列

对于我心中的可视化,我想创建一个使用不同颜色填充圆圈的矩形排列。例如,像这样:

+ + + +
+ + + *
+ + * *
+ * * *
* * * *

其中+是蓝色圆圈,*是红色圆圈。

我创建了一个有点功能性的版本,改编自其他问题

\documentclass[border=5pt,tikz,multi]{standalone}
\usetikzlibrary{fit,positioning}
\begin{document}
\begin{tikzpicture}[ultra thick]
\coordinate (c0) at (0,0);
\foreach \i [count=\j, evaluate=\j as \k using \j-1, evaluate=\j as \n using { \j>0 ? "blue" : "red" }] in {1,...,3}
\node (c\j) [right=5 pt of c\k |- c0, circle, anchor=north west, minimum size=1mm, draw, fill=\n, \n] {};

\coordinate (c0) at (0,1);
\foreach \i [count=\j, evaluate=\j as \k using \j-1, evaluate=\j as \n using { \j>1 ? "blue" : "red" }] in {1,...,3}
\node (c\j) [right=5pt of c\k |- c0, circle, anchor=north west, minimum size=1mm, draw, fill=\n, \n] {};

\coordinate (c0) at (0,2);
\foreach \i [count=\j, evaluate=\j as \k using \j-1, evaluate=\j as \n using { \j>2 ? "blue" : "red" }] in {1,...,3}
\node (c\j) [right=5pt of c\k |- c0, circle, anchor=north west, minimum size=1mm, draw, fill=\n, \n] {};
\end{tikzpicture}
\end{document}

渲染结果如下:

在此处输入图片描述

我对此有几个问题:

  • 我找不到让圆圈之间的垂直和水平边距相等的方法。这意味着圆圈排列内的所有边距都应该相等。在上图中,圆圈太大,垂直距离太大,水平边距太小。
  • 它需要相当多的代码,我想知道是否有更方便的方法来判断哪个圆圈应该有什么颜色。

答案1

matrix是一种放置这些圆圈的简单方法:

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[
    b/.style={fill=blue}]
\matrix(A)[matrix of nodes,
    nodes in empty cells, nodes={circle, fill=red, minimum size=5mm},
    column sep=2mm, row sep=2mm]
    { &&&\\
      &&&|[b]|\\
     &&|[b]|&|[b]|\\
      &|[b]|&|[b]|&|[b]|\\
       |[b]|&|[b]|&|[b]|&|[b]|\\};
\end{tikzpicture}
\end{document}

在此处输入图片描述

您还可以列出哪些圆圈具有不同的颜色,并避免在矩阵内标记它们:

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[
    circles matrix/.style={
        matrix of nodes,
        nodes in empty cells,
        nodes = {circle, fill=red, minimum size=5mm}
    },
    alternative color/.style args={(#1,#2)}{%
        row #1 column #2/.style={nodes={fill=blue}}}        
    ]
\matrix(A)[circles matrix,
    alternative color/.list={(1,1),(2,3),(3,2),(4,4),(5,1),(5,3)},
    column sep=2mm, row sep=2mm]
    { &&&\\ &&&\\ &&&\\ &&&\\ &&&\\};
\end{tikzpicture}
\end{document}

在此处输入图片描述

但你也可以使用foreach循环:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[x=8mm,y=8mm]
\foreach \y in {1,...,5}{
    \foreach \x in {1,...,4}{
        \ifnum\numexpr6-\y>\x
            \node [circle, fill=red, minimum size=5mm] at (\x,-\y) {};
        \else%
            \node [circle, fill=blue, minimum size=5mm] at (\x,-\y) {};
        \fi%
    }
    }
\end{tikzpicture}
\end{document}

答案2

此代码是使用 PGF 语法从上述 Ignasi 代码重写的。大小通过圆的半径、列数、行数x ? y : z来控制。[scale]nm

在此处输入图片描述

\documentclass[tikz,border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}[scale=.5]
\def\n{4} % number of rows
\def\m{5} % number of columns
\foreach \i in {1,...,\n} 
\foreach \j in {1,...,\m}
{
\pgfmathparse{\m-\i<\j ? "violet" : "teal"}
\fill[\pgfmathresult] (\i,-\j) circle(.3);
}
\end{tikzpicture}
\end{document}

相关内容