How to draw a poset Hasse Diagram using TikZ?
Here is a brief tutorial to get you started: As in any other piece of software, break it down into its components.
First step is to draw the nodes and give them name. Lets start with the top node located at the origin and name it
(top)
:\documentclass{article} \usepackage{tikz} \begin{document} \begin{tikzpicture} \node (top) at (0,0) {$\{x,y\}$}; \end{tikzpicture} \end{document}
So now you have:
which is not too exciting.
Note: I included the full code here, but subsequent steps I show only the additions to the above to make it easier to follow.
Next, add the left and right nodes. These should be located relative to the
(top)
node so that in case we decide to move the position of the top node, these two will move along with it:\node [below left of=top] (left) {$x$}; \node [below right of=top] (right) {$y$};
So, now things a looking a bit more useful:
If these are not far enough apart, you could move them, again relatively, by using something like
xshift=<length>
, orxshift=<length>
.Next step is to draw the lines connecting these nodes via their node names (color used here to see the correspondence between the code and the output):
\draw [red, thick] (top) -- (left); \draw [blue, thick] (top) -- (right);
to get:
If the lines are not long enough you can shorten then via a negative amount. For the top we use
shorten <=-2pt
, and for the bottomshorten >=-2pt
to get:Using the
to
syntax as opposed to the--
allows you to get fancier and control the angle at the out point viaout=<angle>
, and the angle of the line coming in viain=<angle>
:\draw [red, thick, shorten <=-2pt, shorten >=-2pt, out=-120, in=90] (top) to (left); \draw [blue, thick, shorten <=-2pt, shorten >=-2pt, out=-60, in=90] (top) to (right);
which if it had been used below would have produced:
As pointed out by Paul Gaborit, the
out
andin
options are really only for theto
directive so some might prefer a syntax that more explicitly places those options for theto
as in:\draw [red, thick, shorten <=-2pt, shorten >=-2pt] (top) to [out=-120, in=90] (left); \draw [blue, thick, shorten <=-2pt, shorten >=-2pt] (top) to [out=-60, in=90] (right);
References:
Other tutorial like answers here which might be useful for new tikz
users include:
- how to add arrow between arrows, how to put an arrow on a second arrow.
Code:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% First, locate each of the nodes and name them
\node (top) at (0,0) {$\{x,y\}$};
\node [below left of=top] (left) {$x$};
\node [below right of=top] (right) {$y$};
% Now draw the lines:
\draw [red, thick, shorten <=-2pt, shorten >=-2pt] (top) -- (left);
\draw [blue, thick, shorten <=-2pt, shorten >=-2pt] (top) -- (right);
\end{tikzpicture}
\end{document}
Recently, I also had to draw Hasse diagrams, so I post a few examples to get you going. My approach has been rather simple: specifying the nodes and draw the necessary lines between them with --. I just post a few examples to get you going.
Here's a variation of the diamond:
\begin{tikzpicture}[scale=.7]
\node (one) at (0,2) {$1$};
\node (a) at (-3,0) {$a$};
\node (b) at (-1,0) {$b$};
\node (c) at (1,0) {$c$};
\node (d) at (3,0) {$d$};
\node (zero) at (0,-2) {$0$};
\draw (zero) -- (a) -- (one) -- (b) -- (zero) -- (c) -- (one) -- (d) -- (zero);
\end{tikzpicture}
This code gives the following Hasse diagram:
Here is an example of a hexagon for the use of polar coordinates:
\begin{tikzpicture}[scale=.7]
\node (one) at (90:2cm) {$1$};
\node (b) at (150:2cm) {$b$};
\node (a) at (210:2cm) {$a$};
\node (zero) at (270:2cm) {$0$};
\node (c) at (330:2cm) {$c$};
\node (d) at (30:2cm) {$d$};
\draw (zero) -- (a) -- (b) -- (one) -- (d) -- (c) -- (zero);
\end{tikzpicture}
which gives as output:
And here is a representation of the boolean algebra of subsets of a three element set, to illustrate intersecting lines:
\begin{tikzpicture}
\node (max) at (0,4) {$(1,1,1)$};
\node (a) at (-2,2) {$(0,1,1)$};
\node (b) at (0,2) {$(1,0,1)$};
\node (c) at (2,2) {$(1,1,0)$};
\node (d) at (-2,0) {$(0,0,1)$};
\node (e) at (0,0) {$(0,1,0)$};
\node (f) at (2,0) {$(1,0,0)$};
\node (min) at (0,-2) {$(0,0,0)$};
\draw (min) -- (d) -- (a) -- (max) -- (b) -- (f)
(e) -- (min) -- (f) -- (c) -- (max)
(d) -- (b);
\draw[preaction={draw=white, -,line width=6pt}] (a) -- (e) -- (c);
\end{tikzpicture}
which draws the diagram