2

Could someone, whenever it's possible, post a minimal tikZ example to draw this? I also would like to put an "R" inside the upper box. This is mi code so far (I know, it's a mess):

\documentclass[tikz]{standalone}
\begin{document}
\tikzstyle{vspecies}=[rectangle, minimum size=0.5cm,draw=black,fill=blue]
\begin{tikzpicture}

\node [vspecies] (I) {I} ;
\node [vspecies, above left of = I] (N) {M} ;
\node [vspecies, below left of = I] (K) {K} ;
\draw [->,thick] (S.south east) --  node {\small{$N$}}  (M) ; ;
\draw [->,thick] (C) --  node [below right]    {\small{$M$}} (M) ;

\end{tikzpicture}
\end{document}

enter image description here

  • 1
    You can use local bounding box. Btw, your code is not even compilable – user156344 Apr 16 at 5:13
3

Just for fun.

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\tikzset{vspecies/.style={rectangle, minimum size=0.5cm,draw=blue}}
\begin{tikzpicture}[>=latex]
 \node[draw,minimum width=1cm,minimum height=2cm,
 label=left:$M$,label=above:$N$] (R){$R$};
 \node [vspecies,below left=1cm and 0.2cm of R,minimum height=1.2cm,
 label=left:$M$,label=above:$K$] (R1) {} ;
 \node [vspecies,below right=1cm and 0.2cm of R,minimum width=1.2cm,
 label=left:$K$,label=above:$N$] (R2) {} ;
 \draw [->,thick,shorten >=1mm,shorten <=1mm] (R.south west) -- (R1.north east);
 \draw [->,thick,shorten >=1mm,shorten <=1mm] (R.south east) -- (R2.north west);
\end{tikzpicture}
\end{document}

enter image description here

3

Something like this?

\documentclass[tikz,margin=1mm]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\begin{scope}[local bounding box=a]
    \node[minimum width=2cm,minimum height=3cm,draw] (main-a) {};
    \path (main-a.west) node[left] {$N$} (main-a.north) node[above] {$M$};
\end{scope}
\begin{scope}[local bounding box=b2]
    \node[minimum width=2cm,minimum height=1cm,draw,below right=of main-a] (main-b2) {};
    \path (main-b2.east) node[right] {$K$} (main-b2.north) node[above] {$M$};
\end{scope}
\begin{scope}[local bounding box=b1]
    \node[minimum width=1cm,minimum height=3cm,draw,below left=of main-a] (main-b1) {};
    \path (main-b1.west) node[left] {$N$} (main-b1.north) node[above] {$K$};
\end{scope}
\draw[-stealth] (main-a.south) -- (b1.north east);
\draw[-stealth] (main-a.south) -- (b2.north west);
\end{tikzpicture}
\end{document}

enter image description here

3

Here is an overkill solution that defines a new pics "shape" (see section 18.2 of the 3.1.1 tikz manual),together with some custom pgfkeys for styling it. The end result is that you can produce:

enter image description here

using code:

\documentclass[tikz, border=5mm]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\pgfkeys{/vspecies/.is family, /vspecies,
  colour/.initial  = black, % rectangle colour
  fill/.initial    = white, % default fill
  top label/.initial = M,   % label on right
  right label/.initial= N,  % label on left
  bottom label/.initial=,   % label on left
  left label/.initial=,     % label on left
  X/.initial       = 5mm,   % default width
  Y/.initial       = 5mm,   % default height
  shape/.initial   = rectangle % default shape
}

\tikzset{
pics/vspecies/.style args={#1,#2}{% node name, pgfkeys key-value pairs
     code = {
      \pgfkeys{/vspecies, #2}
      \node[\pgfkeysvalueof{/vspecies/shape},
            minimum size=\pgfkeysvalueof{/vspecies/X},
            minimum height=\pgfkeysvalueof{/vspecies/Y},
            draw=\pgfkeysvalueof{/vspecies/colour},
            fill=\pgfkeysvalueof{/vspecies/fill},
            label=east:\pgfkeysvalueof{/vspecies/left label},
            label=north:\pgfkeysvalueof{/vspecies/top label},
            label=south:\pgfkeysvalueof{/vspecies/bottom label},
            label=west:\pgfkeysvalueof{/vspecies/right label},
      ](#1) at (0,0){};
     }
  }
}

\begin{tikzpicture}
  \pic at (0,0) {vspecies={A,colour=red,Y=10mm}};
  \pic[below left=10mm of A] {vspecies={B,top label=K,colour=blue,Y=20mm}};
  \pic[below right=10mm of A] {vspecies={C,fill=blue!10,X=10mm,shape=circle,left label=N,right label=}};
  \draw[->](A.south west)--(B.north east);
  \draw[->](A.south east)--(C.north west);
\end{tikzpicture}

\end{document}

The vspecies pic command take two arguments: the first is the name of a (normal) tikz node label and the second argunment is a comma separated list of key-value pairs tha specify:

  • the colour of the rectangle (default black)
  • the fill colour (default white)
  • the top label (default M)
  • the left label (default "")
  • the bottom label (default "")
  • the left label (default N)
  • the minimum X width
  • the minimum Y height
  • the shape (default rectangle)

As I said, this is overkill (and I was bored:)

0

Final version:

\documentclass[tikz,margin=1mm]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\sffamily
\begin{tikzpicture}
\begin{scope}[local bounding box=a]
\node[minimum width=2cm,line width=0.199mm,minimum   height=3cm,draw=black] (main-a) {R};
\path (main-a.west) node[left] {N} (main-a.north) node[above] {M};
\end{scope}
\begin{scope}[local bounding box=b2]
\node[minimum width=2cm,line width=0.199mm,minimum height=1cm,draw=blue,below right=of main-a] (main-b2) {};
\path (main-b2.east) node[right] {K} (main-b2.north) node[above] {M};
\end{scope}
\begin{scope}[local bounding box=b1]
\node[minimum width=1cm,line width=0.199mm,minimum height=3cm,draw=blue,below left=of main-a] (main-b1) {};
\path (main-b1.west) node[left] {N} (main-b1.north) node[above] {K};
\end{scope}
\draw[-stealth] (main-a.south) -- (b1.north east);
\draw[-stealth] (main-a.south) -- (b2.north west);
\end{tikzpicture}
\end{document}

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.