Baum oder nicht Baum

Heute sah ich eine ältere unbeantwortete Frage auf TeX.SE. Der Anlass war, mehrere Bäume zu zeichnen, die durch eine Linie verbunden sind. Am Ende kann man das wieder als Baum sehen, und etwas in komplizierter verschachtelter Baum-Syntax basteln, doch ich dachte mir, das kann man unbefangen in normalem TikZ angehen:

  • Ein paar Stile für Knoten-Typen definieren, klar
  • Die Koordinaten der wesentlichen Knoten auf dem Blatt platzieren samt Texten
  • Weitere Nodes platzieren, wie es gut aussieht, dabei möglichst relativ positionieren: zwischen, über oder unter anderen Nodes, mit Faktor und ggf. Verschiebung
  • Mit Linien verbinden

Dabei kann man die calc-library Syntax verwenden für Zwischenpunkte mit Faktor, Verschiebung, oder Projektion auf Linien. Dank relativer Bezüge kann man immer noch an Längen oder Faktoren justieren, und die Nodes wandern mit.
Weiterlesen

Schreibe einen Kommentar

Ternäre Diagramme

Gerade sah ich ein QAPF-Diagramm, das interessant aussah:

Intrusive
Das lässt sich sicher auch gut mit TikZ machen:
Weiterlesen

Schreibe einen Kommentar

Eine Mindmap vom Matheplaneten

Heute begegnete mir eine TikZ-Mindmap – in freier Wildbahn! Ich sah sie auf der Matheplanet-Award-Verleihung. Ich konnte nicht umhin, ein bisschen daran herumzubasteln, aber nur wenig. Weil ich Serifen in Diagrammen nicht so dolle mag, lieber Styles definiere statt Schriftbefehle in nodes zu setzen, bisschen kürze und einrücke und mit Leerzeichen den Code etwas für mich leserlicher entspanne… also abgesehen vom Codegebastel sah die Mindmap fast genauso aus:

mindmap

Und der Code hierfür ist, ausgehend von Martins Code leicht optimiert:

\documentclass[margin=10pt]{standalone}
\PassOptionsToPackage{usenames,svgnames}{xcolor}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage{microtype}
\usepackage{tikz}
\usetikzlibrary{mindmap}
\begin{document}
\pagecolor{black!50!green!50!}
\begin{tikzpicture}[
             nodes = { font = \sffamily\bfseries, align = center,
                       execute at begin node = {\hspace{0pt}}},
      large/.style = { concept, font = \Large\sffamily\bfseries},
       huge/.style = { concept, font = \Huge\sffamily\bfseries},
      black/.style = { color = black},
      white/.style = { color = white},
    black45/.style = { color = black, sibling angle = 45},
    white40/.style = { color = white, sibling angle = 40},
 
]
  \path[mindmap, concept color = purple!30!yellow!70!, text = white]
    node[huge, scale = 0.85, text = purple] {Matheplanet}
    [clockwise from = -60]
    child[concept color = blue] {
      node[large, level distance = 2.4cm] {Fachbereiche}
      [clockwise from = 25]
      child[white, level distance = 2.4cm]
        { node[concept, scale = 0.8] {Informatik} }
      child[white40, level distance = 2.4cm] {
        node[concept, scale = 0.7] {\LaTeX} }
      child[white, sibling angle = 38,
        level distance = 2.4cm
] { node[concept, scale = 0.7] {3M} }
      child[white, sibling angle = 42] {
        node[concept, scale = 1.25] {Mathematik}
      [clockwise from = -15]
      child[white, level distance = 2.5cm] {
        node[concept, scale = 0.9] {Olympiadeaufgaben} } }
      child[white, sibling angle = 43] {
        node[concept, scale = 0.9] {Physik}
      [clockwise from = 85]
      child[white, level distance = 2.1cm]
        { node[concept] {Ingenieurwesen} } }
    }
    child[concept color = brown!80!yellow] {
      node[large, text = black] {Rubriken}
      [clockwise from = -75]
      child[black45, level distance = 2.6cm] {
        node[concept] {Buchreviews} }
      child[black45] { node[concept, scale=0.6] {WMM} }
      child[black45] { node[concept, scale=0.8] {Links} }
      child[black45] { node[concept] {Artikel}
        [clockwise from = 25] child[black]
          { node[concept] {Montagsreport} } }
    }
    child[concept color = red!50!white] {
      node[concept, text = black] {Besucher}
      [clockwise from=90]
      child[black45] { node[concept] {Chat} }
      child[black45, level distance = 2.5cm] {
        node[concept, scale = 0.8] {Nachtwache} }
    }
    child[concept color = teal] {
      node[large] {Events}
      [clockwise from = 160]
      child[white] { node[concept, scale = 0.85] {Schach}
      [clockwise from = 82] child[white,
        level distance = 1.7cm
] { node[concept] {MPCC} } }
      child[white] { node[concept] {Treffen}
          [clockwise from = 25]
      child[white] { node[concept] {Impulsvortrag} }
      child[white, sibling angle = 240] { node[concept]
        {Regional} } }
      child[white] { node[concept] {Award} }
      child[white] { node[concept, scale=0.7] {Challenge} }
    }
  child[concept color = green!50!LimeGreen] { node[large] {Mitglieder}
 [clockwise from = 90]
   child[white] { node[concept] {Senioren}
     [clockwise from = 30] child[white] {
       node[concept, scale = 1.4] {Wissen} } }
  child[white40] { node[concept, scale = 0.8] {Moderatoren}
    [clockwise from = 20]
  child[white, level distance = 1.8cm] {
    node[concept] {Ordnung} } }
  child[white40] { node[concept, scale = 0.7] {Spender}
    [clockwise from=33]
   child[white, level distance = 1.7cm] {
     node[concept, scale = 0.8] {Geld} }
  }
  child[white40] { node[concept, scale=0.8] {Matroid}
    [clockwise from = -145] child[white] {
    node[concept] {Technik} }}
  }  
    child[concept color = red!90!cyan] {
      node[large, grow = -30] {Forum}
      [clockwise from = 61]
      child[white, level distance = 5cm, scale = 0.9] {
        node[concept] {Aktuelles \& Interessantes} }
      child[white, sibling angle = 28, level distance = 2.8cm] {
        node[concept] {Erfahrungsaustausch} }
      child[white, sibling angle = 36,
        level distance = 2.5cm
] {
        node[concept, scale = 1.1] {Hilfestellung} }
      child[white, sibling angle = 39] {
        node[concept] {Zusammenarbeit}
  [clockwise from = -63]
  child[white] { node[concept] {Collatz} }
  child[white, level distance = 4cm, sibling angle = 17] {
    node[concept] {Streichholzgraphen} }
  child[white, sibling angle = 17] { node[concept] {Al Zimm.} } }
    child[white, sibling angle = 49, level distance = 2.5cm] {
      node[concept, scale = 0.95] {Knobelecke} }
  };
\end{tikzpicture}
\end{document
}

Eine kleine hier eingefügte Sache ist execute at begin node = {\hspace{0pt}: TeX trennt das erste Wort eines Absatzes nicht, mit diesem kleinen Hack sorge ich dafür, dass die teils langen aber einzelnen Wörter in den nodes dennoch automatisch getrennt werden dürfen, da sie nicht mehr absolut am Absatzbeginn stehen. Kein manuelles Trennen mit – und \\ nötig.

Dort auf dem Matheplaneten fand wie gesagt gerade die Verleihung der Awards für beste Beteiligung statt, das 15. Mal nun. Damit werden die besten Helfer in Mathematik, Physik, Informatik, LaTeX, Mathematik-Software und mehr gewürdigt, gewählt durch die Mitglieder.

Ich freue mich darüber, einen Award als LaTeX-Helfer erhalten zu haben. Seit 2005 bin ich beim Matheplaneten dabei, das war wohl sogar meine erste aktive Beteiligung an einem Internet-Forum.

Ein Kommentar

Zeitlinien

Gequält vom Abgabetermin meines nächsten Buchs habe ich einmal eine Zeitplanung erstellt. Es lässt sich ja wundervoll mit TikZ prokrastinieren (den Begriff erkläre ich später). Mit der timeline-Library ist das fast ein Kinderspiel. Fast, denn noch ist sie kaum dokumentiert, man könnte den Quellcode lesen, oder sich an einem Beispiel orientieren. Daher, hier kommt eines! Einfach draufklicken für ein großes Bild, der Code folgt weiter unten.

timeline

Weiterlesen

Kommentare: 4

Mindmaps

Neulich habe ich von mir betreute Server und Applikationen einmal als Mindmap visualisiert. Den Code nahm ich nun mal her, um anhand von TeX-Themen ein Beispiel zu zeigen, wie man Ideen ausbreiten kann, ausgehend von einem zentralen Konzept, um das sich Haupt-Themen gruppieren, die sich in weitere Themen verzweigen. Schwierig? Ist es nicht. Hier einmal poliert, wenngleich nicht perfekt, als Anschauungsbeispiel, mit gar nicht so langem Code.
mindmap
Weiterlesen

Kommentare: 3

Bunte Diagramme

Gerade skizzierte ich einige TeX erläuternde Diagramme. Da möchte ich doch kurz zeigen, wie einfach es mit dem Paket “smartdiagram” sein kann.

Beispielsweise wird dieses Ablauf-Diagramm

smart-circle

 erzeugt durch diesen kurzen aber komplett so übersetzbaren Code:

Weiterlesen

Schreibe einen Kommentar

Seitenverzierungen mit pgfornament

Heute schauen wir uns einmal an, wie man Dokumente mit Zierlinien und -grafiken schmücken kann.

Werkzeug ist das Paket

pgfornament

und das hat einfach eine Erwähnung verdient.
Die Möglichkeiten und die auswählbaren Muster sind vielfältig – für Hintergründe und Download des Pakets siehe in den Links HIER.

Beispiel

Weiterlesen

Schreibe einen Kommentar

PGFPlots 1.11 erschienen

Christian Feuersänger hat die Version 1.11 von PGFPlots veröffentlicht. Bereits vor einer Woche, doch bei diesem besonderen Paket ist mir diese Neuigkeit wichtig, daher teile ich sie gern noch hier mit. Schließlich gibt es noch einen Ausblick zu berichten.

Parametric Breather Pseudospherical SurfaceHervorheben möchte ich zwei der neuen Features. Man kann jetzt in trigonometrischen Funktionen Argumente in Radiant angeben, statt nur in Grad. Damit entfällt die Umrechnung durch deg() in Grad, wie vorher mit sin(deg(x)) nötig, wenn x nicht in Grad gegeben war. Entsprechend vereinfacht sich die Eingabe komplexer trigonometrischer Ausdrücke. Man braucht nur einmalig trig format plots=rad als Option anzugeben.

Spherical HarmonicsIm Code zum Bild oben ist es “vorher und nacher” zu sehen, in der Antwort von Christian auf TeXwelt auf die Frage, ob man bei pgfplots von Grad auf Radiant umstellen kann mit der Ankündigung des neuen Features. Oder gleich als Anwendung in einem Minimalbeispiel – hier habe ich auf diese Weise die linksstehende Abbildung (spherical harmonics, für Quantenmechanik) geplottet, die Henri in PSTricks angefragt hatte:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{trig format plots=rad, compat=1.11}
\usepgfplotslibrary{colormaps}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[colormap/violet, hide axis]
    \addplot3[
      surf,
      domain     = 0:pi,
      domain y   = 0:2*pi,
      samples    = 50,
      samples y  = 70,
      z buffer   = sort
   
]
    ( {sin(x)*cos(y)*(sqrt(3/(4*pi))*sin(x)*cos(y))^2},
      {sin(x)*sin(y)*(sqrt(3/(4*pi))*sin(x)*cos(y))^2},
      {cos(x)*(sqrt(3/(4*pi))*sin(x)*cos(y))^2} );
  \end{axis}
\end{tikzpicture}
\end{document
}

NormalverteilungWeiterhin wird das Hinzufügen von zusätzlichen Beschriftungen einfacher. Bislang konnte man sich mit axis cs: auf das Koordinatensystem beziehen, um Linien, Pfeile oder Beschriftungen einzuzeichnen. Das sah beispielsweise so aus, wie in diesem Ausschnitt von Elkes gefüllter Fläche unter einer Normalverteilung:

\draw [dotted] (axis cs:2.698,-4) -- (axis cs:2.698,4.5);
\node at (axis cs:0,1.4) [anchor=east, rotate=90] {50\,\%};

Mit der neuen Version vereinfacht sich das zu

\draw [dotted] (2.698,-4) -- (2.698,4.5);
\node at (0,1.4) [anchor=east, rotate=90] {50\,\%};

Also sparsamer zu schreiben und leichter lesbar, gerade wenn man es (wie beim Elkes Plot) öfter einsetzt.

Der kleine Versions-Sprung bringt weitere Modellpflege, es wurden einige aufgefundene Bugs behoben. So kaum merkliche, dass ich bei intensiver Nutzung nur einen davon bemerkt hatte, der nun auch gleich behoben wurde (mit der units library trat unter Umständen zuviel Weißraum auf – bounding box zu groß). Details zu den Bugfixes kann man in der README-Datei nachlesen.

Zum Ausblick: in einem Kommentar zu Drehtransformation mit pgfplots kündigte Christian an, dass er sich in der Entwicklung von PGFPlots gerade auf Skalierbarkeit und Geschwindigkeit konzentriert, motiviert durch die 3d-Oberflächen-Plots auf TeXwelt. Er hat auch schon einen Prototypen fertig, der das dortige Beispiel mit doppelter Geschwindigkeit übersetzt. Es wird dann ein Lua backend verwendet. Darauf freue ich mich sehr, denn ich erstelle regelmäßig komplexe Plots und übersetze sie vielfach, bis Blickwinkel, Samplingrate, Färbung und mehr Optionen eine bestmögliche Darstellung liefern.

Man kann mit seinem Paketmanager seine PGFPlots-Installation updaten, ansonsten kriegt man die neueste Version auch auf SourceForge und auf CTAN.

Ein Kommentar