我正在绘制由网格组成的图表,其中一些单元格用圆圈填充,如下所示:
我创建了这张图片
\begin{tikzpicture}[scale=0.6]
\draw[shift={(0.5,0.5)}] (0,0) grid (6,6);
\foreach \x in {0,1,...,5} {
\node at (\x+1,7) {$\x$};
\node[left] at (0,6-\x) {$\x$};
}
\foreach \x in {2,3,4,5} {
\foreach \y in {3,4} {
\fill (\x,\y) circle(0.2);
\fill (\y,\x) circle(0.2);
}
}
\end{tikzpicture}
现在,这幅图中的点非常对称,所以我可以用一些简洁的\foreach
语句来放置它们。但在其他图中,点更加随机地分散,所以我需要某种方式将它们逐一输入。
这有效(对于不同的图表):
\begin{tikzpicture}[circ/.style = {circle,radius=2mm,fill=black},scale=0.6]
\draw[shift={(0.5,0.5)}] (0,0) grid (6,6);
\foreach \x in {0,1,...,5} {
\node at (\x+1,7) {$\x$};
\node[left] at (0,6-\x) {$\x$};
}
\matrix[matrix of nodes,row sep=2.8mm,column sep=2.8mm,shift={(2.1,2.1)}] {
\node[circ] {}; & \node[circ] {}; & \node[circ] {}; &&&\\
\node[circ] {}; & \node[circ] {}; & \node[circ] {}; &&&\\
\node[circ] {}; & \node[circ] {}; & \node[circ] {}; & \node[circ] {};&&\\
&&\node[circ] {}; & \node[circ] {}; & \node[circ] {};\\
&&&\node[circ] {}; & \node[circ] {}; & \node[circ] {};\\
&&&\node[circ] {}; & \node[circ] {}; & \node[circ] {};\\
};
\end{tikzpicture}
但将矩阵排列到正确的位置很麻烦。另外,我似乎无法正确缩放圆圈 - 它们最终会像这样填满整个单元格:
这显然不是我想要的是。
那么 - 如何使用matrix
TiKZ 用小圆圈填充网格中的某些单元格? 或者还有其他更好的方法吗?
答案1
我将使用它来绘制网格\matrix
,因为这样做可以提供类似的锚点m-i-j
(如矩阵的i
第行和第列),您以后可以在绘制圆圈时访问它们。j
我通过定义一个命令实现了部分自动化\mygrid
,该命令采用两个参数来指定网格的尺寸。(如果网格始终为正方形,则可以通过删除第二个参数来简化命令。)
在缩放方面,可以通过将选项传递scale
给 来缩放圆圈本身tikzpicture
,如果要缩放网格,请将scale
选项传递给\mygrid
。
平均能量损失
\documentclass{article}
\usepackage{tikz,etoolbox}
\usetikzlibrary{matrix}
\newcommand\mygrid[3][]{ % this definition uses \foreach inside a matrix
\let\mymatrixcontent\empty % see http://tex.stackexchange.com/q/60394/18228
\newcommand{\row}{%
\foreach \j in {1,...,#2}{
\foreach \i in {1,...,#3} {%
\begingroup\edef\x{\endgroup
\noexpand\gappto\noexpand\mymatrixcontent{|[draw,minimum size=1cm,#1]| \&}}\x
}%
\gappto\mymatrixcontent{\\}%
}
}
\row
\matrix(m)[matrix of nodes,ampersand replacement=\&,row sep=-\pgflinewidth,column sep=-\pgflinewidth]{
\mymatrixcontent
};
\foreach \x[count=\i from 0] in {1,...,#2}\node[left] at (m-\x-1.west) {$\i$};
\foreach \y[count=\j from 0] in {1,...,#3}\node[above] at (m-1-\y.north) {$\j$};
}
\begin{document}
\begin{tikzpicture}[scale=.5,]
\mygrid[scale=.6]{6}{8} % two extra columns just for demonstration
\foreach\j[count=\i,remember=\i as \x(initially 3)] in{1,...,6}{
\filldraw(m-\i-\j)circle[radius=2pt];
\filldraw(m-\x-\j)circle[radius=2pt];
\filldraw(m-\j-\x)circle[radius=2pt];
\filldraw(m-6-4)circle[radius=2pt];
}
\end{tikzpicture}
\end{document}
输出
答案2
另一个没有命令的选项\mygrid
。它绘制一个带有空节点的矩阵,并定义一个用于append after command
在里面放置点的节点样式。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning}
\begin{document}
\begin{tikzpicture}[
mycell/.style={draw, minimum size=1cm},
dot/.style={mycell,
append after command={\pgfextra \fill (\tikzlastnode) circle[radius=5pt]; \endpgfextra}}]
\matrix (m) [matrix of nodes, row sep=-\pgflinewidth, column sep=-\pgflinewidth,
nodes={mycell}, nodes in empty cells]
{
&&&|[dot]|&&\\
&&&&&\\
&&&&|[dot]|&\\
|[dot]|&&&&&\\
&&&&&\\
&|[dot]|&&&&\\
};
% labels on top and left
\foreach \i [count=\xi from 0] in {1,...,6}{
\node[mycell, label=above:\xi] at (m-1-\i) {};
\node[mycell,label=left:\xi] at (m-\i-1) {};
}
\end{tikzpicture}
\end{document}
答案3
以下是创建此类图表的简短解决方案:
\documentclass[tikz,border=7mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
% draw the grid and the numbers
\draw (-1,-1) grid (5,5) foreach \i in {0,...,5}{
(\i-.5,5.5) node{\i} (-1.5,4.5-\i) node{\i}};
% for every line we give first and last index to fill
\foreach[count=\j] \a/\b in {0/2,0/2,0/3,2/4,3/5,3/5}
\foreach \i in {\a,...,\b}
\fill[red,shift={(-.5,5.5)},yscale=-1] (\i,\j) circle(2mm);
\end{tikzpicture}
\end{document}