对于我心中的可视化,我想创建一个使用不同颜色填充圆圈的矩形排列。例如,像这样:
+ + + +
+ + + *
+ + * *
+ * * *
* * * *
其中+
是蓝色圆圈,*
是红色圆圈。
我创建了一个有点功能性的版本,改编自其他问题:
\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]
n
m
\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}