20

I wonder how beautiful it would be, if we could draw the trace determinant diagram with TikZ or any other package on LaTeX. enter image description here Image source


Edited: Here is my MWE:

\documentclass[10pt]{article}
    \usepackage{pgf,tikz}
        \usetikzlibrary{arrows}
    \usepackage{mathrsfs}
    \usepackage{amssymb,fancyhdr,txfonts,pxfonts}
    \pagestyle{empty}
\begin{document}
    \begin{tikzpicture}[%
        line cap=round,
        line join=round,
        >=triangle 45,
        x=1.0cm,
        y=1.0cm%
    ]

        \clip(-5.8,-3.58) rectangle (5.56,5.64);
        \draw [line width=1.2pt] (0.,4.68)-- (0.,-0.74);
        \draw [line width=1.2pt] (-4.,0.)-- (4.3,0.);
        \draw [thick, domain=-2:2] plot (\x, {\x*\x}); 
        \draw (3.62,-0.12) node[anchor=north west] {$\mbox{tr}$};
        \draw (0.18,4.78) node[anchor=north west] {$\Delta$};
        \draw(0.,2.88) circle (0.3255764119219941cm);
        \draw(0.,2.88) circle (0.4833218389437828cm);
        \draw(0.,2.88) circle (0.6403124237432849cm);
        \draw (1.,-1.)-- (-1.,-3.);
        \draw (-1.,-1.)-- (1.,-3.);
        \draw [dash pattern=on 2pt off 2pt] (-1.,-2.)-- (1.,-2.);
        \draw [dash pattern=on 2pt off 2pt] (0.,-1.)-- (0.,-3.);
    \end{tikzpicture}
\end{document}

enter image description here

  • 1
    A tip: If you indent lines by 4 spaces, they'll be marked as a code sample. You can also highlight the code and click the "code" button (with "{}" on it). – ebosi Jan 5 '17 at 9:07
  • That looks good so far. I am looking forward to see more of that :-) – Jan Jan 5 '17 at 9:33
33

enter image description here

% Poincaré Diagram: Classification of Phase Portaits in the (det A,Tr A)-plane
% Author: Gernot Salzer
% Based on a drawing by Douglas R. Hundley, people.whitman.edu/~hundledr/courses/M244/Poincare.pdf
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings,arrows}

\tikzset
  {every pin/.style={pin edge={<-}}
  ,>=stealth
  ,flow/.style=
    {decoration=
      {markings
      ,mark=at position #1 with {\arrow{>}}
      }
    ,postaction={decorate}
    }
  ,flow/.default=0.5
  }
\newcommand\inlayscale{}
\newcommand\inlaycaption[1]{{\sffamily\scriptsize#1}}
\newcommand\newinlay[4][0.18]%
  {\renewcommand\inlayscale{#1}%
   \newsavebox#2%
   \savebox#2%
     {\begin{tabular}{@{}c@{}}
        #4\\[-1ex]
        \inlaycaption{#3}\\[-1ex]
      \end{tabular}%
     }%
  }
\newcommand\inlay[1]{\usebox{#1}}
\newcommand\Tr{\mathop{\mathrm{Tr}}}

\newinlay\saddle{saddle}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \foreach \sx in {+,-}
      {\draw[flow] (\sx4,0) -- (0,0);
       \draw[flow] (0,0) -- (0,\sx4);
       \foreach \sy in {+,-}
         \foreach \a/\b/\c/\d in {2.8/0.3/0.7/0.6,3.9/0.4/1.3/1.1}
           \draw[flow] (\sx\a,\sy\b)
              .. controls (\sx\c,\sy\d) and (\sx\d,\sy\c)
              .. (\sx\b,\sy\a);
      }
   \end{tikzpicture}%
  }

\newinlay\sink{sink}%
  {\begin{tikzpicture}[scale=\inlayscale]
    \foreach \sx in {+,-}
     {\draw[flow] (\sx4,0) -- (0,0);
      \draw[flow] (0,\sx4) -- (0,0);
      \foreach \sy in {+,-}
         \foreach \a/\b in {2/1,3/0.44}
          \draw[flow,domain=\sx\a:0] plot (\x, {\sy\b*\x*\x});
     }
   \end{tikzpicture}%
  }

\newinlay\source{source}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \foreach \sx in {+,-}
      {\draw[flow] (0,0) -- (\sx4,0);
       \draw[flow] (0,0) -- (0,\sx4);
       \foreach \sy in {+,-}
         \foreach \a/\b in {2/1,3/0.44}
           \draw[flow,domain=0:\sx\a] plot (\x, {\sy\b*\x*\x});
      }
   \end{tikzpicture}%
  }

\newinlay\stablefp{line of stable fixed points}%
  {\begin{tikzpicture}[scale=\inlayscale]
    \draw (-4,0) -- (4,0);
    \foreach \s in {+,-}
     {\draw[flow] (0,\s4) -- (0,0);
      \foreach \x in {-3,-2,-1,1,2,3}
        \draw[flow] (\x,\s3) -- (\x,0);
     }
   \end{tikzpicture}%
  }

\newinlay\unstablefp{line of unstable fixed points}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (-4,0) -- (4,0);
     \foreach \s in {+,-}
      {\draw[flow] (0,0) -- (0,\s4);
       \foreach \x in {-3,-2,-1,1,2,3}
         \draw[flow] (\x,0) -- (\x,\s3);
      }
   \end{tikzpicture}%
  }

\newinlay\spiralsink{spiral sink}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (-4,0) -- (4,0);
     \draw (0,-4) -- (0,4);
     \draw[samples=100,smooth,domain=27:7] plot ({\x r}: {0.005*\x*\x});
     \draw[->] ({26 r}: {0.005*26*26}) -- +(0.01,-0.01);
   \end{tikzpicture}%
  }

\newinlay\spiralsource{spiral source}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (-4,0) -- (4,0);
     \draw (0,-4) -- (0,4);
     \draw [samples=100,smooth,domain=10:28] plot ({-\x r}: {0.005*\x*\x});
     \draw[<-] ({-27.5 r}: {0.005*27.5*27.5}) -- +(0.01,-0.008);
   \end{tikzpicture}%
  }

\newinlay[0.15]\centre{center}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (-4,0) -- (4,0);
     \draw (0,-4) -- (0,4);
     \foreach \r in {1,2,3} \draw[flow=0.63] (\r,0) arc (0:-360:\r cm);
   \end{tikzpicture}%
  }

\newinlay\degensink{degenerate sink}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (0,-4) -- (0,4);
     \draw[flow] (-4,0) -- (0,0);
     \draw[flow] (4,0) -- (0,0);
     \draw[flow] (-3.5,3.5) .. controls (4,1.5) and (4,1).. (0,0);
     \draw[flow] (3.5,-3.5) .. controls (-4,-1.5) and (-4,-1) .. (0,0);
     \draw[flow] (-3.5,2.5) .. controls (2,1) and (2,0.8).. (0,0);
     \draw[flow] (3.5,-2.5) .. controls (-2,-1) and (-2,-0.8) .. (0,0);
   \end{tikzpicture}%
  }

\newinlay\degensource{degenerate source}%
  {\begin{tikzpicture}[scale=\inlayscale]
     \draw (0,-4) -- (0,4);
     \draw[flow] (0,0) -- (-4,0);
     \draw[flow] (0,0) -- (4,0);
     \draw[flow] (0,0) .. controls (4,1.5) and (4,1).. (-3.5,3.5);
     \draw[flow] (0,0) .. controls (-4,-1.5) and (-4,-1) .. (3.5,-3.5);
     \draw[flow] (0,0) .. controls (2,1) and (2,0.8).. (-3.5,2.5);
     \draw[flow] (0,0) .. controls (-2,-1) and (-2,-0.8) .. (3.5,-2.5);
   \end{tikzpicture}%
  }

\begin{document}
\begin{tikzpicture}[line cap=round,line join=round]
  % Main diagram
  \draw[line width=1pt,->] (0,-0.3) -- (0, 4.7) coordinate (+y);
  \draw[line width=1pt,->] (-5,0) -- ( 5,0) coordinate (+x);
  \draw[line width=1pt, domain=-4:4] plot (\x, {0.25*\x*\x});
  \node at (+y) [label={[above,yshift=0.8cm]%
    {\sffamily\large Poincar\'e Diagram: Classification of Phase Portaits
     in the $(\det A,\Tr A)$-plane}}] {};
  \node at (+x) [label={[right,yshift=-0.5ex]$\scriptstyle\Tr A$}] {}; 
  \node at (+y) [label={[above]$\scriptstyle\det A$}] {};
  \node at (-4,4) [pin={[above]$\scriptstyle\Delta=0$}] {};
  \node at ( 4,4) [pin={[above,align=left]{%
    $\scriptstyle\Delta=0$:\\
    $\scriptstyle\det A=\frac{1}{4}(\Tr A)^2$}}] {};
  % inlays
  \node at (0,-1.4) {\inlay\saddle};
  \node at (0,1.2)
    [pin={[draw,right,xshift=0.3cm]\inlay\centre}] {};
  \node at (0,0)
    [pin={[draw,above left,align=center,xshift=-0.3cm]%
    \inlaycaption{uniform}\\[-1ex]\inlaycaption{motion}}] {};
  \node at (-4,1) {\inlay\sink};
  \node at ( 4,1) {\inlay\source}; 
  \node at (-3,0) [pin={[draw,below,yshift=-1cm]\inlay\stablefp}] {};
  \node at  (3,0) [pin={[draw,below,yshift=-1cm]\inlay\unstablefp}] {};
  \node at (-1.8,3.7) {\inlay\spiralsink};
  \node at ( 1.8,3.7) {\inlay\spiralsource};
  \node at (-3.5,{0.25*3.5*3.5})
    [pin={[draw,left,xshift=-1.15cm,yshift=-0.3cm]\inlay\degensink}] {};
  \node at ( 3.5,{0.25*3.5*3.5})
    [pin={[draw,right,xshift=0.9cm,yshift=-0.3cm]\inlay\degensource}] {};
\end{tikzpicture}
\end{document}
  • 1
    Very sweet! +1. – Steven B. Segletes Jan 6 '17 at 13:03
  • (+1) if only for the sheer number of your answers ;). – cfr Jan 7 '17 at 23:21
  • @cfr Thanks for the appreciation, even if it's only for the quantity :-) Initially I hoped that this could become a collaborative effort, since I didn't want to invest the time for doing everything myself; didn't work quite out, though ... – gernot says Reinstate Monica Jan 8 '17 at 18:37
  • I didn't mean it was only for the quantity, but merely that the quantity alone would surely justify a vote :-). Of course, a large quantity of useless answers would not deserve a vote. Not a vote up, at any rate. – cfr Jan 9 '17 at 4:17
11

Before posting his final winning answer, gernot had posted a number of answers, each of which represented a single graphical component of the final picture. Once posting his final answer, he deleted the component answers.

For this answer, I lifted those pieces-parts from gernot's [since deleted] components and the OP's question, to demonstrate that, once you have all the components, one can use \stackinset to overlay them on the base graph, perhaps.

His components included the tikz parts identified in the following MWE as \spiralA, \spiralB, \degensink, \degensource, \nondegensink, and \nondegensource,

\documentclass[10pt]{article}
    \usepackage{pgf,tikz}
        \usetikzlibrary{arrows}
    \usepackage{mathrsfs}
    \usepackage{amssymb,fancyhdr,txfonts,pxfonts}
    \pagestyle{empty}
    \usetikzlibrary{decorations.markings}
\usepackage{stackengine}
\renewcommand\stacktype{L}
\setstackgap{L}{8pt}
\begin{document}
\savestack\mygraph{%
    \begin{tikzpicture}[%
        line cap=round,
        line join=round,
        >=triangle 45,
        x=1.0cm,
        y=1.0cm%
    ]
%
        \clip(-5.8,-3.58) rectangle (5.56,5.64);
        \draw [line width=1.2pt] (0.,4.68)-- (0.,-0.74);
        \draw [line width=1.2pt] (-4.,0.)-- (4.3,0.);
        \draw [thick, domain=-2:2] plot (\x, {\x*\x}); 
        \draw (3.62,-0.12) node[anchor=north west] {$\mathrm{Tr}\,A$};
        \draw (-.4,5.1) node[anchor=north west] {$\scriptstyle\det A$};
        \draw (-2.35,4.7) node[anchor=north west] {%
          \stackunder{$\scriptstyle\Delta=0$}{$\downarrow$}};
        \draw (1.08,5.1) node[anchor=north west] {\ensurestackMath{\stackunder[11pt]{%
          \Longstack[l]{\scriptstyle\Delta=0: \scriptstyle\det A=\frac{1}{4}(%
            \mathrm{Tr}A)^2}}{\downarrow}}};
        \draw (1.,-1.)-- (-1.,-3.);
        \draw (-1.,-1.)-- (1.,-3.);
        \draw [dash pattern=on 2pt off 2pt] (-1.,-2.)-- (1.,-2.);
        \draw [dash pattern=on 2pt off 2pt] (0.,-1.)-- (0.,-3.);
    \end{tikzpicture}%
}
\savestack\spiralA{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.1 with {\arrow{stealth}}
      }
   ,scale=0.5
   ]
   \draw (-4,0) -- (4,0);
   \draw (0,-4) -- (0,4);
   \draw[postaction={decorate},domain=27:7,variable=\t,smooth,samples=100]
       plot ({\t r}: {0.005*\t*\t});
\end{tikzpicture}%
}
\savestack\spiralB{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.99 with {\arrow{stealth}}
      }
   ,scale=0.5
   ]
   \draw (-4,0) -- (4,0);
   \draw (0,-4) -- (0,4);
   \draw[postaction={decorate},domain=10:28.5,variable=\t,smooth,samples=100]
       plot ({-\t r}: {0.005*\t*\t});
\end{tikzpicture}
}
\savestack\degensink{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.5 with {\arrow{stealth}}
      }
   ,scale=0.5
   ]
   \draw (0,-4) -- (0,4);
   \draw[postaction={decorate}] (-4,0) -- (0,0);
   \draw[postaction={decorate}] (4,0) -- (0,0);
   \draw[postaction={decorate}] (-3.5,3.5) .. controls (4,1.5) and (4,1).. (0,0);
   \draw[postaction={decorate}] (3.5,-3.5) .. controls (-4,-1.5) and (-4,-1) .. (0,0);
   \draw[postaction={decorate}] (-3.5,2.5) .. controls (2,1) and (2,0.8).. (0,0);
   \draw[postaction={decorate}] (3.5,-2.5) .. controls (-2,-1) and (-2,-0.8) .. (0,0);
\end{tikzpicture}%
}
\savestack\degensource{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.5 with {\arrow{stealth}}
      }
   ,scale=0.5
   ]
   \draw (0,-4) -- (0,4);
   \draw[postaction={decorate}] (0,0) -- (-4,0);
   \draw[postaction={decorate}] (0,0) -- (4,0);
   \draw[postaction={decorate}] (0,0) .. controls (4,1.5) and (4,1).. (-3.5,3.5);
   \draw[postaction={decorate}] (0,0) .. controls (-4,-1.5) and (-4,-1) .. (3.5,-3.5);
   \draw[postaction={decorate}] (0,0) .. controls (2,1) and (2,0.8).. (-3.5,2.5);
   \draw[postaction={decorate}] (0,0) .. controls (-2,-1) and (-2,-0.8) .. (3.5,-2.5);
\end{tikzpicture}%
}
\savestack\nondegensink{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.5 with {\arrow{stealth}}
      }
   ,scale=0.5
   ,plotsettings/.style={postaction={decorate}}
   ]
   \draw[postaction={decorate}] (0,-4) -- (0,0);
   \draw[postaction={decorate}] (0,4) -- (0,0);
   \draw[postaction={decorate}] (-4,0) -- (0,0);
   \draw[postaction={decorate}] (4,0) -- (0,0);
   \draw [plotsettings,domain=-2:0] plot (\x, {\x*\x}); 
   \draw [plotsettings,domain= 0:2] plot (\x, {\x*\x}); 
   \draw [plotsettings,domain=-2:0] plot (\x, {-\x*\x}); 
   \draw [plotsettings,domain= 0:2] plot (\x, {-\x*\x}); 
   \draw [plotsettings,domain=-3:0] plot (\x, {0.44*\x*\x}); 
   \draw [plotsettings,domain= 0:3] plot (\x, {0.44*\x*\x}); 
   \draw [plotsettings,domain=-3:0] plot (\x, {-0.44*\x*\x}); 
   \draw [plotsettings,domain= 0:3] plot (\x, {-0.44*\x*\x}); 
\end{tikzpicture}%
}
\savestack\nondegensource{%
\begin{tikzpicture}
   [decoration=
      {markings,
       mark=at position 0.5 with {\arrow{stealth}}
      }
   ,scale=0.5
   ,plotsettings/.style={postaction={decorate}}
   ]
   \draw[postaction={decorate}] (0,0) -- (-4,0);
   \draw[postaction={decorate}] (0,0) -- (4,0);
   \draw[postaction={decorate}] (0,0) -- (0,-4);
   \draw[postaction={decorate}] (0,0) -- (0,4);
   \draw [plotsettings,domain=0:-2] plot (\x, {\x*\x}); 
   \draw [plotsettings,domain=2: 0] plot (\x, {\x*\x}); 
   \draw [plotsettings,domain=0:-2] plot (\x, {-\x*\x}); 
   \draw [plotsettings,domain=2: 0] plot (\x, {-\x*\x}); 
   \draw [plotsettings,domain=0:-3] plot (\x, {0.44*\x*\x}); 
   \draw [plotsettings,domain=3: 0] plot (\x, {0.44*\x*\x}); 
   \draw [plotsettings,domain=0:-3] plot (\x, {-0.44*\x*\x}); 
   \draw [plotsettings,domain=3: 0] plot (\x, {-0.44*\x*\x}); 
\end{tikzpicture}%
}
\stackinset{c}{-55pt}{c}{2pt}{\stackunder[24pt]{$\vcenter{\hbox{\scalebox{.3}{%
  \nondegensink}}}$}{\scriptsize\Longunderstack[l]{sink}}%
  }{%
\stackinset{c}{60pt}{c}{2pt}{\stackunder[24pt]{$\vcenter{\hbox{\scalebox{.3}{%
  \nondegensource}}}$}{\scriptsize\Longunderstack[l]{source}}%
  }{%
\stackinset{c}{-71pt}{c}{56pt}{\stackunder[24pt]{$\vcenter{\hbox{\scalebox{.3}{%
  \fbox{\degensink}}}}$}{\scriptsize\Longunderstack[l]{degenerate sink}}%
  $\!\rightarrow$}{%
\stackinset{c}{78pt}{c}{56pt}{$\leftarrow\!$%
  \stackunder[24pt]{$\vcenter{\hbox{\scalebox{.3}{%
  \fbox{\degensink}}}}$}{\scriptsize\Longunderstack[r]{degenerate source}}%
  }{%
\stackinset{c}{-20pt}{c}{62pt}{\stackunder{\scalebox{.35}{\spiralA}}{%
  \scriptsize spiral sink}}{%
\stackinset{c}{27pt}{c}{62pt}{\stackunder{\scalebox{.35}{\spiralB}}{%
  \scriptsize spiral source}}{%
  \mygraph%
}}}}}}
\end{document}

enter image description here

  • Excellent Steven. Many compliments. – Sebastiano Jan 5 '17 at 17:12
  • Thanks. Can't upvote again, though :(. – cfr Jan 8 '17 at 0:34
  • +1 Impressive demonstration of your package; helps me to remember it for the next time I need something like this. But I'm not sure whether this particular task is an ideal application: your stacked approach is at least one level lower in the abstraction hierarchy than annotating the base graph with pins and labels. – gernot says Reinstate Monica Jan 8 '17 at 18:46

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.