TikZ:使用循环绘制节点网格

TikZ:使用循环绘制节点网格

我正在尝试使用 TikZ 绘制 Ising 模型(在我的情况下,是同一行或列上相邻节点之间具有无向边的节点网格)。我使用 foreach 循环很好地完成了节点网格,但在绘制节点之间的线条时遇到了麻烦。问题在于,当我尝试在\draw计算的节点名称之间划线时,出现了语法错误。

以下是我目前所掌握的信息:

在此处输入图片描述

以下是我使用的代码:


\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\scriptsize
\foreach \i in {1,...,25}
{
        \pgfmathtruncatemacro{\y}{(\i - 1) / 5};
        \pgfmathtruncatemacro{\x}{\i - 5 * \y};
        \pgfmathtruncatemacro{\label}{\x + 5 * (4 - \y)};
        \node[circle,draw=black,fill=white!80!black,minimum size=20]
        (\label) at (1.5*\x,1.5*\y) {\label};
}
% These draw commands are working as intended.
\draw (1) -- (2);
\draw (1) -- (6);
\draw (6) -- (7);
\draw (7) -- (2);
% The loop, however, is not =(
%\foreach \x in {1,...,4}
%\foreach \y in {0,...,4}
%{
%       \pgfmathtruncatemacro{\cur}{\x + 5 * \y};
%       \pgfmathtruncatemacro{\next}{\cur + 1};
%       \draw (\cur) -- (\next);
%}
\end{tikzpicture}
\end{document}

非常感谢您的帮助!

答案1

可以使用最小代码

\documentclass{minimal}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=gray!40,minimum size=20}]
  \foreach \x in {0,...,4}
    \foreach \y in {0,...,4} 
       {\pgfmathtruncatemacro{\label}{\x - 5 *  \y +21}
       \node [darkstyle]  (\x\y) at (1.5*\x,1.5*\y) {\label};} 

  \foreach \x in {0,...,4}
    \foreach \y [count=\yi] in {0,...,3}  
      \draw (\x\y)--(\x\yi) (\y\x)--(\yi\x) ;

\end{tikzpicture}
\end{document}  

在此处输入图片描述

仅供参考,您可以通过 tkz-berge 获取网格

\documentclass[border=0.25cm]{standalone}
\usepackage{tkz-berge}

\begin{document}

 \begin{tikzpicture}
      \GraphInit[vstyle=Shade]
   \grGrid[Math,RA=2,RB=2]{5}{5}
 \end{tikzpicture}

\end{document} 

在此处输入图片描述

答案2

使用你的循环:

\foreach \x in {1,...,4}
\foreach \y in {0,...,4}
{
       \pgfmathtruncatemacro{\cur}{\x + 5* \y}
       \pgfmathtruncatemacro{\next}{\cur + 1}
       \draw (\cur) -- (\next);
}

你实际上只是画了水平线。因此,如果我正确理解了这个问题,你需要画垂直线。

为了简单起见,我使用了另一个循环:

% Vertical connections
\foreach \start in {1,...,20}
{
    \pgfmathtruncatemacro{\down}{\start+5}
    \draw (\start) -- (\down);  
}

完整代码如下:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{positioning}

\tikzset{darkstyle/.style={circle,draw,fill=gray!40}}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,...,25}
{
        \pgfmathtruncatemacro{\y}{(\i - 1) / 5}
        \pgfmathtruncatemacro{\x}{\i - 5 * \y}
        \pgfmathtruncatemacro{\label}{\x + 5 * (4 - \y)}
        \node[darkstyle,minimum size=20] (\label) at (1.5*\x,1.5*\y)
        {\label};
}

% Horizontal connections

\foreach \x in {1,...,4}
\foreach \y in {0,...,4}
{
       \pgfmathtruncatemacro{\cur}{\x + 5* \y}
       \pgfmathtruncatemacro{\next}{\cur + 1}
       \draw (\cur) -- (\next);
}

% Vertical connections
\foreach \start in {1,...,20}
{
    \pgfmathtruncatemacro{\down}{\start+5}
    \draw (\start) -- (\down);  
}

\end{tikzpicture}
\end{document}

结果是:

在此处输入图片描述

答案3

由于这看起来像一个grid,您也可以使用一个(可能还有两个嵌套foreach循环来生成节点):

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw[step=1.5,thick] (0,-6) grid (6,0);
\foreach \x in {0,...,4}
{   \foreach \y in {0,...,4}
    {   \pgfmathtruncatemacro{\nodelabel}{\x+\y*5+1}
        \node[circle,draw=black,fill=white!80!black,minimum size=20] (\nodelabel) at (1.5*\x,-1.5*\y) {\nodelabel};
    }
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案4

你可以让 TikZ 使用graphs库/\graph语法子图Grid_n来自graphs.standard图书馆

如果你想要改变特定的边缘而不必手动绘制所有边缘,你可以使用simple钥匙并手动为各个边指定选项(甚至可以使用 将其删除-!-)。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs.standard}
\begin{document}
\tikz[x=+1.5cm, y=+1.5cm]
  \graph[
    grid placement,
    nodes={circle, draw=black, fill=white!80!black, minimum size=+20pt}
  ]{ subgraph Grid_n [n = 25] };
\end{document}

输出

在此处输入图片描述

相关内容