2

I'm trying to draw something of the sort enter image description here

with a square figure in the far left, and a rectangular figure cut into 4 slices on the right-hand side. Above the arrows and below the figures reads "text". The middle portion consists of $\Omega_i$'s, with arrows coming from $\Omega_1$, $\Omega_j$, and $\Omega_k$.

How would one draw such a figure?

6

You can use TikZ:

enter image description here

The code:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc,matrix,shapes.multipart}

\begin{document}

\begin{tikzpicture}[
node distance=1cm and 1.5cm,
arrow/.style={
  ->,
  >=latex,
  shorten >= 3pt,
  shorten <= 3pt,
}
]
\node[draw,minimum size=3cm,label={270:text}]
  (rect) {};
\coordinate[right=of rect] (aux);
\matrix[matrix of math nodes]
  at ([xshift=8pt]aux)
  (mat)
  {
    \Omega_i \\
    \vdots \\
    \Omega_j \\
    \vdots \\
    \Omega_k \\
  };
\node[draw,rectangle split,rectangle split horizontal=true,right=1.5cm of mat,minimum size=1cm,label={270:text}] 
  (rectiv) {};
\node[circle,draw,right=of rectiv,minimum size=1cm,label={270:text}]
  (circ)  {};
\draw[arrow]
  (rect) -- node[above] {text} (aux);        
\foreach \Valor/\Texto/\Pos in {1/texti/above,3/textj/above,5/textk/below}
{
\draw[arrow]
  (mat-\Valor-1.east) -- node[pos=0.3,\Pos,sloped] {\Texto} (rectiv.west);        
}
\draw[arrow]
  (rectiv) -- node[above] {text} (circ);        
\end{tikzpicture}

\end{document}
5

Here's another version using nodes and arrows.

Output

figure 1

Code

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,shapes.multipart,positioning}

\tikzset{   
    split/.style={rectangle split, rectangle split parts=4,
        rectangle split horizontal, rectangle split empty part width=4mm},
}

\begin{document}
\begin{tikzpicture}[node distance=2cm, -{Straight Barb}]

\node[draw, minimum width=4cm, minimum height=3cm, label=270:text] (big) at (0,0) {};
\node[right =of big] (oj) {$\Omega_j$};
\node[below =1.5cm of oj] (ok) {$\Omega_k$};
\node[above =1.5cm of oj] (oi) {$\Omega_i$};
\node[draw, split, minimum width=4cm, minimum height=2cm, label=270:text, right =of oj] (multi) {};
\node[draw, circle, minimum size=4cm, right =of multi,label=270:text] (circ) {};

% lines and arrows
\draw (big) -- (oj) node[above, midway] {text};
\draw[-, thick, loosely dotted] (ok) -- (oj) -- (oi);
\draw (oj) -- (multi.west) node[above, midway] {text};
\draw (oi) -- (multi.160) node[above, midway, sloped] {text};
\draw (ok) -- (multi.200) node[above, midway, sloped] {text};
\draw (multi) -- (circ);

\end{tikzpicture}
\end{document}
  • Is it possible to add separate text areas above the other two arrows on the omega nodes? – Anthony Peter Jul 10 '15 at 17:45
  • @AnthonyPeter Sure. See update. – Alenanno Jul 10 '15 at 17:48
4

The chains library offers another possibility, especially convenient when used in conjunction with the quotes and scopes libraries. Nodes on chains are automatically named using the name of the chain and the count of nodes on that chain. Here, I call the chain c1 so the nodes are c1, c2 etc.

I also use two branches, c2 and c3. The nodes on branches are named <chain name>/<branch name>-<count of nodes on branch> e.g. c1/c2-2 means the second node on branch c2 of chain c1.

A few styles are offered for convenience, and to ensure consistency in the placement and style of nodes, labels and edges.

Most edges are drawn using the join option from the chains library. The exceptions are the two diagonal arrows which it seemed easier to draw by hand.

For example:

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{chains,arrows.meta,scopes,shapes.multipart,quotes}

\begin{document}
\begin{tikzpicture}
  [
    start chain=c1 going right,
    every on chain/.style={join},
    every edge/.append style={font=\scriptsize, shorten >=5pt, shorten <=5pt},
    >={Stealth[]},
    my join/.style={join=by {"#1"}},
    every edge quotes/.append style={midway, sloped, anchor=south},
    node distance=1 and 2,
  ]
  {[every join/.append style={->}]
    \node [on chain=c1, label=-90:text, text height=40pt, text width=40pt, draw] {};
    \node [on chain, my join=text] {$\Omega_j$};
    { [start branch=c2 going above ] }% manual 54
    { [start branch=c3 going below ] }
    \node [on chain, label=-90:text, draw, minimum height=20pt, rectangle split, rectangle split horizontal, rectangle split parts=4, rectangle split ignore empty parts=false, my join=textj] {};
    \node [on chain, label=-90:text, draw, circle, minimum size=20pt, my join=text] {};
  }
  {[every join/.append style={densely dotted}]
    {[continue branch=c2]
      \node [on chain] {$\Omega_i$};
    }
    {[continue branch=c3]
      \node [on chain] {$\Omega_k$};
    }
  }
  \draw (c1/c2-2) edge [->, "texti"] (c1-3.west);
  \draw (c1/c3-2) edge [->, "textk"] (c1-3.west);
\end{tikzpicture}
\end{document}

chained nodes

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.