平均能量损失

平均能量损失

我正在绘制由网格组成的图表,其中一些单元格用圆圈填充,如下所示:

在此处输入图片描述

我创建了这张图片

\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}

但将矩阵排列到正确的位置很麻烦。另外,我似乎无法正确缩放圆圈 - 它们最终会像这样填满整个单元格:

在此处输入图片描述

这显然不是我想要的是。

那么 - 如何使用matrixTiKZ 用小圆圈填充网格中的某些单元格? 或者还有其他更好的方法吗?

答案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}

在此处输入图片描述

相关内容