% Note the LaTeX code here uses a package that both shows the code and the output.
% This package is: tkzexample
% This ensures that the LaTeX corresponds to the figure.
%
% However, this means that there are extra lines in the source code below:
%
% \begin{tkzexample}
%  [....]
% \end{tkzexample}
%
% (This should not cause confusion since the lines do not show up in the
% pdf version, but we note it here, in case a reader does not have access to the pdf)

\documentclass[11pt]{article}
\usepackage{natbib}
\usepackage{amsmath,amssymb,booktabs,url}
\usepackage{xcolor}
\usepackage{pgf,tikz}
\usetikzlibrary{arrows,shapes.arrows,shapes.geometric,
shapes.multipart,decorations.pathmorphing,positioning,
swigs}

\usepackage{tkzexample} % to show code and pictures side by side
%%% Note useful tkzexample options here:
%% [very small] makes the code small
%% [vbox]   stacks the figure before the code

\begin{document}

\colorlet{graphicbackground}{blue!10!white}%
\colorlet{codebackground}{red!10}%
\colorlet{codeonlybackground}{red!10}% sets background for tkzltxexample

\title{TikZ/PGF shape library for constructing Single-World Intervention Graphs (SWIGs)}
\author{Thomas S. Richardson\\[2pt]
Department of Statistics\\
University of Washington}
\date{9 July 2021}
\maketitle

Single World Intervention Graphs (SWIGs) are a graphical formalism for unifying two approaches to building
(statistical) causal models \citep{swigs}.

Key to the representation is an operation of `node splitting', whereby a single node is divided into
two pieces. It is important that the resulting halves can still be seen to have originated from a single node.

\begin{center}

\begin{tikzpicture}
\tikzset{line width=1.5pt}
\node[name=a1,shape=swig hsplit, swig hsplit={line color lower=red}]{
       \nodepart{upper}{$A_1$}
       \nodepart{lower}{$a_1$}   };
\node[name=a2,shape=swig vsplit, right=of a1, swig vsplit={line color right=red}]{
        \nodepart{left}{$A_2(a_1)$}
        \nodepart{right}{$a_2$}  };
\draw[->,line width=1pt](a1) to[out=350,in=180] (a2);
\end{tikzpicture}

\end{center}

It has been hard to draw SWIGs using standard packages in TikZ/PGF.  Two separate {\tt semicircle} shapes can be used, but it is difficult to ensure that the two halves look as if they arise from a single circle, at least without introducing a lot of whitespace. TikZ does contain a shape, called {\tt split ellipse}, but this does not provide a way to add space between the two halves of the shape.
(There does not appear to be a semi-ellipse shape.)

We address this by introducing two multipart shapes: {\tt swig hsplit}  that creates an ellipse that has been split horizontally, and
and {\tt swig vsplit} that is split vertically. The latter shape also adjusts the ratio of the two halves depending on the text that is contained.

\eject
\subsection*{Preliminaries}

The examples included below use the following packages:
%%%%%
\begin{tkzltxexample}[]
\documentclass[10pt]{article}
\usepackage{amsmath,amssymb,xcolor}
\usepackage{pgf,tikz}
\usetikzlibrary{arrows,shapes.arrows,shapes.geometric,
shapes.multipart,decorations.pathmorphing,positioning,
swigs}
\begin{document}
..
\end{tkzltxexample}

%%%%%

%\noindent The last library listed here uses the code in the file:\par
%{\tt tikzlibraryshapes.swigs.code.tex} \par
%\noindent (As this is not part of the TeX distribution,  this file should be placed in the working directory.)




\subsection*{SWIG with horizontal split}

Here is a very simple example:

\begin{tkzexample}[very small,latex=4cm]
\begin{tikzpicture}
\node[name=a1,shape=swig hsplit]{
       \nodepart{upper}{$A_1$}
       \nodepart{lower}{$a_1$}   };
\node[name=a2,shape=swig hsplit,right=of a1]{
        \nodepart{upper}{$A_2(a_1)$}
        \nodepart{lower}{$a_2$}  };
\draw[->](a1) to[out=350,in=170] (a2);
\end{tikzpicture}
\end{tkzexample}

\bigskip

\noindent The parameter {\tt gap} can be adjusted to change the size of the gap:



\begin{tkzexample}[latex=4cm, very small]
\begin{tikzpicture}
\node[name=a1,shape=swig hsplit,
swig hsplit={gap=5pt}]{
       \nodepart{upper}{$A_1$}
       \nodepart{lower}{$a_1$}  };
\node[name=a2,shape=swig hsplit, right=of a1]{
       \nodepart{upper}{$A_2(a_1)$}
       \nodepart{lower}{$a_2$}  };
\draw[->](a1) to[out=350,in=170] (a2);
\end{tikzpicture}
\end{tkzexample}

\medskip
\eject

\noindent This can also be done globally for all split nodes;
here we also make the line color red for lower halves.

\begin{tkzexample}[latex=4cm, very small]
\begin{tikzpicture}
\tikzset{swig hsplit={gap=5pt,line color lower=red}}
\node[name=a1,shape=swig hsplit]{
       \nodepart{upper}{$A_1$}
       \nodepart{lower}{$a_1$} };
\node[name=a2,shape=swig hsplit, right=of a1]{
       \nodepart{upper}{$A_2(a_1)$}
       \nodepart{lower}{$a_2$} };
\draw[->](a1) to[out=350,in=170] (a2);
\end{tikzpicture}
\end{tkzexample}

\medskip

\noindent For black and white publications color may not be sufficient to distinguish
upper and lower halves. For this purpose a double line can be used.
{\tt inner line width lower} specifies the width of the inner gap.

\begin{tkzexample}[latex=4cm, very small]
\begin{tikzpicture}
\tikzset{line width=1.5pt,
   swig hsplit={gap=4pt,
                inner line width lower=0.5pt}}]
\node[name=a1,shape=swig hsplit]{
       \nodepart{upper}{$A_1$}
       \nodepart{lower}{$a_1$} };
\node[name=a2,shape=swig hsplit, right=of a1]{
       \nodepart{upper}{$A_2(a_1)$}
       \nodepart{lower}{$a_2$} };
\draw[->,line width=1.5pt,>=stealth](a1)
   to[out=350,in=170] (a2);
\end{tikzpicture}
\end{tkzexample}

\eject

\noindent The example below shows the full set of anchors and other options.

\begin{center}

\begin{tkzexample}[vbox, very small]
\Huge
\begin{tikzpicture}
\pgfsetinnerstrokecolor{blue!10!white} % so inner line col=background
\tikzset{shape example/.style={fill=yellow!5,
           inner sep=0.3cm,outer sep=0cm}}
 \node[name=s, shape example, shape=swig hsplit,
      swig hsplit={
            line color upper=red!30,
            fill color upper=yellow!30,
            line color lower=green!30,
            fill color lower=yellow!30,
            gap=40pt,
            line width upper= 10pt,
            inner line width upper = 0pt,
            line width lower=15pt,
            inner line width lower = 4pt}]
           {\nodepart[red!30]{upper}{$A_4(a_1,a_2)$}
            \nodepart[green!30]{lower}{$a_4$}};
 \draw[->,line width=5pt, draw=blue!15,>=stealth]
                             (s.upper center) to (s.lower center);
 \foreach \anchor/\placement in
   {center/right, upper center/left,
   upper/below, lower center/left, lower/left,
   60/above right,  200/below left,
    mid/above, mid east/above right, mid west/above left,
    upper base/below right, base east/right, base west/left,
    upper east/right, upper west/left,
    north/above, south/below, west/left, east/right,
    lower west/left, lower east/right,
    north east/above right, south east/below right,
    south west/below left, north west/above left,
    lower base/below right, lower mid/above}
    \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
      node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{tkzexample}
\end{center}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\eject

\subsection*{SWIG with vertical split}

Here we describe the instructions for creating ellipses with vertical splits. These are often more efficient in terms of space.
As before, first a very simple example:

\begin{tkzexample}[very small,latex=5.5cm]
\begin{tikzpicture}
\node[name=a1,shape=swig vsplit]{
       \nodepart{left}{$A_1$}
       \nodepart{right}{$a_1$}  };
\node[name=a2, right=5mm of a1,
            shape=swig vsplit] {
            \nodepart{left}{$A_2(a_1)$}
            \nodepart{right}{$a_2$} };
\draw[->](a1) to (a2);
\end{tikzpicture}
\end{tkzexample}

\bigskip

\noindent The parameter {\tt gap} can be adjusted to change the size of the gap:

\begin{tkzexample}[very small,latex=5cm]
\begin{tikzpicture}
\node[name=a1,shape=swig vsplit,
 swig vsplit={gap=3pt}]{
       \nodepart{left}{$A_1$}
       \nodepart{right}{$a_1$}  };
\node[name=a2, right=3mm of a1,
            shape=swig vsplit] {
            \nodepart{left}{$A_2(a_1)$}
            \nodepart{right}{$a_2$} };
\draw[->](a1) to (a2);
\end{tikzpicture}
\end{tkzexample}

\medskip

\noindent This can also be done globally for all split nodes;
here we also make the line color red for right halves.

\begin{tkzexample}[latex=5cm, very small]
\begin{tikzpicture}
\tikzset{swig vsplit={gap=3pt,
                 line color right=red}}
\node[name=a1,shape=swig vsplit]{
       \nodepart{left}{$A_1$}
       \nodepart{right}{$a_1$} };
\node[name=a2,shape=swig vsplit,
                 right=5mm of a1]{
       \nodepart{left}{$A_2(a_1)$}
       \nodepart{right}{$a_2$} };
\draw[->](a1) to (a2);
\end{tikzpicture}
\end{tkzexample}

\medskip

\eject

\noindent  As before, a version for black and white publications:

\begin{tkzexample}[latex=5cm, very small]
\begin{tikzpicture}
\tikzset{line width=1.5pt,
        swig vsplit={gap=3pt,
        inner line width right=0.5pt}}
\node[name=a1,shape=swig vsplit]{
       \nodepart{left}{$A_1$}
       \nodepart{right}{$a_1$} };
\node[name=a2,shape=swig vsplit,
                 right=3mm of a1]{
       \nodepart{left}{$A_2(a_1)$}
       \nodepart{right}{$a_2$} };
\draw[->,line width=1.5pt,>=stealth]
   (a1) to (a2);
\end{tikzpicture}
\end{tkzexample}

\bigskip

\noindent Here is an example with multiple stages:

\begin{tkzexample}[vbox]
\begin{tikzpicture}
\tikzset{line width=1.5pt, outer sep=0pt,
        ell/.style={draw,fill=white, inner sep=2pt,
         line width=1.5pt},
        swig vsplit={gap=5pt,
        inner line width right=0.5pt}};
\node[name=l1, ell, shape=ellipse]{$L_1$};
\node[name=a1,right=5mm of l1, shape=swig vsplit]{
       \nodepart{left}{$A_1$}
       \nodepart{right}{$a_1$} };
\node[name=l2, right=5mm of a1, ell, shape=ellipse]{$L_2(a_1)$};
\node[name=a2,shape=swig vsplit,
                 right=5mm of l2]{
       \nodepart{left}{$A_2(a_1)$}
       \nodepart{right}{$a_2$} };
\node[name=y, right=5mm of a2, ell, shape=ellipse]{$Y(a_1,a_2)$};
\draw[->,line width=1.5pt,>=stealth]
   (l1) edge (a1)
    (l1) edge[out=330,in=210] (a2)
   (a1) edge (l2)
   (a1) edge[out=15,in=150] (a2)
   (a1) edge[out=30,in=150] (y)
   (l2) edge (a2)
   (a2) edge (y);
\end{tikzpicture}
\end{tkzexample}





\eject

\noindent Expanded nodes showing additional options and anchors.

\begin{tkzexample}[vbox, very small]
\Huge
\begin{tikzpicture}
\pgfsetinnerstrokecolor{blue!10!white} % so inner line col=background
\tikzset{shape example/.style={draw,fill=yellow!30,
            inner xsep=10pt,inner ysep=25pt,outer xsep=0cm,outer ysep=0cm},
            swig vsplit={line color right=green!30, line color left=red!20,
                       gap=25pt, line width left= 10pt, line width right=15pt,
                     inner line width left = 0pt, inner line width right = 4pt}}
 \node[name=s,shape=swig vsplit, shape example]
           {\nodepart[red!20]{left}{$Y_1(a_1)$}
             \nodepart[green!30]{right}{$y_1$}};
\foreach\anchor/\placement in
 {north/above, south/below, east/right, west/left,
left base/below, right base/below, right/above, left/above,
left mid/above, mid east/right, mid west/left, base east/right,
base west/left, right mid/above,
142/above, 320/below, center/below}
 \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
      node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\begin{scope}[yshift=-4cm]
 \node[name=s,shape=swig vsplit, shape example]
 {\nodepart[red!20]{left}{$Y_1(a_1)$}%
\nodepart[green!30]{right}{$y_1$}};
\foreach\anchor/\placement in
 {left center/below, right center/above,
 left north/above left, left south/below left,
 right north/above right, right south/below right,
north west/above left, south west/below left,
north east/above right, south east/below right}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
      node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{scope}
\end{tikzpicture}
\end{tkzexample}


\bibliographystyle{chicago}

\begin{thebibliography}{}

\bibitem[\protect\citeauthoryear{Richardson and Robins}{Richardson and
 Robins}{2013}]{swigs}
Richardson, T.S. and J.M.~Robins (2013).
\newblock Single world intervention graphs (SWIGs): A unification of
 counterfactual and graphical approaches to causality.
\newblock Working Paper Number 128. Available at
 \url{http://www.csss.washington.edu/Papers/wp128.pdf}.

\end{thebibliography}

%\bibliography{references}

\end{document}