0

I am a new user to tikzplot. Does anyone know how to make the grey box with the nodes inside the box. Thanksenter image description here

enter image description here

3

Not elegant, but it works:

\documentclass[border=5pt,tikz]{standalone}
\usetikzlibrary{fit,positioning,calc,arrows,backgrounds}
\tikzset{
    my/.style={
        draw=green,thick,fill=white,circle,minimum width=.5cm
    },
    >=latex
}
\begin{document}
    \begin{tikzpicture}
        \node[my] (s1) {$S_1$};
            \node[my,right=1 of s1] (a12) {$a_1^2$};
            \node[my,above=1 of a12] (a11) {$a_1^1$};
            \node[my,below=1 of a12] (a1n) {$a_1^n$};
                \node at ($(a12)!.5!(a1n)$) {\vdots};
            \node[above=.5 of a11] (A1) {$A_1$};
            \begin{pgfonlayer}{background}
                \node[fit=(A1)(a1n),draw=green,thick,fill=gray!40] {};
            \end{pgfonlayer}
            \foreach \x in {12,11,1n}
            {
                \draw[->] (s1) -- (a\x);
            }
        \begin{scope}[xshift=3.5cm]
            \node[my] (s2) {$S_2$};
                \node[my,right=1cm of s2] (a22) {$a_2^2$};
                \node[my,above=1 of a22] (a21) {$a_2^1$};
                \node[my,below=1 of a22] (a2m) {$a_2^m$};
                \node at ($(a22)!.5!(a2m)$) {\vdots};
            \node[above=.5 of a21] (A2) {$A_2$};
            \begin{pgfonlayer}{background}
                \node[fit=(A2)(a2m),draw=green,thick,fill=gray!40] {};
            \end{pgfonlayer}
            \foreach \x in {22,21,2m}
            {
                \draw[->] (s2) -- (a\x);
            }
        \end{scope}
        \foreach \x in {12,11,1n}
        {
            \draw[->] (a\x) -- (s2);
        }
        \node[my,xshift=7cm] (s3) {$S_3$};
        \foreach \x in {1.5,0,-1.5}
        {
            \draw[->] (s3) --+ (1,\x) node[right] {\ldots};
        }
        \foreach \x in {22,21,2m}
        {
            \draw[->] (a\x) -- (s3);
        }
        \begin{scope}[xshift=9.5cm]
            \node[my] (a22) {$a_k^1$};
                \node[my,above=1 of a22] (a21) {$a_k^2$};
                \node[my,below=1 of a22] (a2m) {$a_k^t$};
                \node at ($(a22)!.5!(a2m)$) {\vdots};
            \node[above=.5 of a21] (A2) {$A_k$};
            \begin{pgfonlayer}{background}
                \node[fit=(A2)(a2m),draw=green,thick,fill=gray!40] {};
            \end{pgfonlayer}
            \node[my,right=1 of a22] (slast) {$S_{k+1}$};
            \foreach \x in {22,21,2m}
            {
                \draw[->] (a\x) -- (slast);
            }
        \end{scope}
    \end{tikzpicture}
\end{document}

Here is the output:

Screenshot

EDIT:

\documentclass[border=5pt,tikz]{standalone}
\usetikzlibrary{fit,positioning,calc,arrows,backgrounds}
\tikzset{
    my/.style={
        draw=green,thick,fill=white,circle,minimum width=.5cm
    },
    >=latex
}
\begin{document}
    \begin{tikzpicture}
        \node[my] (b11) {$b_1^1$};
        \node[below=1 of b11,my] (b12) {$b_2^1$};
        \node[below=1 of b12,my] (b1nprime) {$b_1^{n'}$};
        \node[below=1 of b1nprime] (B1) {$B_1$};
        \begin{pgfonlayer}{background}
            \node[draw=green,thick,fill=gray!40,fit=(b11)(B1)] {};
        \end{pgfonlayer}
        \draw[->] (b11) -- (b12);
        \draw[->,dotted] (b12) -- (b1nprime);
        \begin{scope}[xshift=3cm]
            \node[my] (b21) {$b_2^1$};
            \node[below=1 of b21,my] (b22) {$b_2^2$};
            \node[below=1 of b22,my] (b2mprime) {$b_2^{m'}$};
            \node[below=1 of b2mprime] (B2) {$B_2$};
            \begin{pgfonlayer}{background}
            \node[draw=green,thick,fill=gray!40,fit=(b21)(B2)] {};
            \end{pgfonlayer}
            \draw[->] (b21) -- (b22);
            \draw[->,dotted] (b22) -- (b2mprime);
        \end{scope}
        \begin{scope}[xshift=6cm]
            \node[my] (bk1) {$b_k^1$};
            \node[below=1 of bk1,my] (bk2) {$b_k^2$};
            \node[below=1 of bk2,my] (bktprime) {$b_k^{t'}$};
            \node[below=1 of bktprime] (Bk) {$B_k$};
            \begin{pgfonlayer}{background}
            \node[draw=green,thick,fill=gray!40,fit=(bk1)(Bk)] {};
            \end{pgfonlayer}
            \draw[->] (bk1) -- (bk2);
            \draw[->,dotted] (bk2) -- (bktprime);
        \end{scope}
        \foreach \x/\y in {b21/bk1,b22/bk2,b2mprime/bktprime}
        {
            \node at ($(\x)!.5!(\y)$) {$\cdots$};
        }
        \node[above=2 of b21,my] (s) {$S$};
        \foreach \x in {11,21,k1}
        {
            \draw[->] (s) -- (b\x);
        }
    \end{tikzpicture}
\end{document}

Here is the second output:

Screenshot

So, if you want an elegant solution, please take marmot's brilliant answer.

  • Hi friend, the latex code looks so complicated for me. Can you help with another plot? I have to submit today to my professor. I really appreciate your help. – Thomas Edison Oct 30 '18 at 14:41
2

Just for fun: a somewhat more automatic solution, which, however, does not have the ... layer. The fit and backgrounds are just like in current_user's nice answer.

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{positioning,fit,backgrounds}
\begin{document}

\tikzset{%
   neuron missing/.style={
    draw=none, 
    scale=2,
    text height=0.333cm,
    execute at begin node=\color{black}$\vdots$
  },
}
% from https://tex.stackexchange.com/a/436220/121799
% The command \DrawNeuronalNetwork has a list as argument, each entry is a
% layer. each entry has the form 
%  Layer name/number of nodes/color/missing node/label/symbolic number
% where
% * layer name is, well,  the name of the layer
% * number of nodes is the number of neurons in that layer (including the missing neuron)
% * color is the color of the layer
% * missing node denotes the index of the missing neuron
% * label denotes the label of the layer
% * symbolic number denotes the symbol that indicates how many neurons there are

\newcommand{\DrawNeuronalNetwork}[2][]{
\xdef\Xmax{0}
\foreach \Layer/\X/\Col/\Miss/\Lab/\Count [count=\Y] in {#2}
{\pgfmathsetmacro{\Xmax}{max(\X,\Xmax)}
 \xdef\Xmax{\Xmax}
 \xdef\Ymax{\Y}
}
\foreach \Layer/\X/\Col/\Miss/\Lab/\Count [count=\Y] in {#2}
{\node[anchor=south] (layer-\Y) at ({2*\Y},{\Xmax/2+0.1}) {\Layer};
 \foreach \m in {1,...,\X}
 {
  \ifnum\m=\Miss
   \node [neuron missing] (neuron-\Y-\m) at ({2*\Y},{\X/2-\m}) {};
  \else
   \node [circle,thick,draw=\Col!50,minimum size=1cm,fill=white] (neuron-\Y-\m) at 
  ({2*\Y},{\X/2-\m}) {};
 \ifnum\Y=1
  \else
   \pgfmathtruncatemacro{\LastY}{\Y-1}
   \foreach \Z in {1,...,\LastX}
   {
    \ifnum\Z=\LastMiss
    \else
     \draw[->] (neuron-\LastY-\Z) -- (neuron-\Y-\m);
    \fi
    }
  \fi
 \fi
 \ifnum\Y=1
  \ifnum\m=\X
     \node at (neuron-\Y-\m) {$\Lab$};
  \else
   \ifnum\m=\Miss
   \else
   \fi
  \fi
 \else
   \ifnum\Y=\Ymax
    \ifnum\m=\X
     \node at (neuron-\Y-\m) {$\Lab$};
    \else
     \ifnum\m=\Miss
     \else
     \fi
    \fi
   \else
     \ifnum\m=\X
      \node at (neuron-\Y-\m) {$\Lab^{\Count}$};
     \else 
      \ifnum\m=\Miss
      \else
       \node at (neuron-\Y-\m) {$\Lab^\m$};
      \fi 
     \fi
   \fi
 \fi     
 }
 \xdef\LastMiss{\Miss}
 \xdef\LastX{\X}
}
}
\begin{tikzpicture}[x=1.5cm, y=1.5cm, >=stealth,font=\sffamily]
\DrawNeuronalNetwork{/1/green/0/S/1,
$A_1$/4/red/3/a_1/n,
/1/green/0/S_2/,
$A_2$/4/red/3/a_2/m,
/1/green/0/S_3/,
$A_3$/4/red/3/a_3/m,
/1/green/0/S_{k+1}/}
\begin{scope}[on background layer]
\node[draw,fill=gray!30,fit=(layer-2) (neuron-2-4)]{};
\node[draw,fill=gray!30,fit=(layer-4) (neuron-4-4)]{};
\node[draw,fill=gray!30,fit=(layer-6) (neuron-6-4)]{};
\end{scope}
\end{tikzpicture}
\end{document} 

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.