Tag Archives: pgfplots

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

Periodisch, mehr oder weniger

Sinuskurve in 3D
Neulich hatte ich sie mal wieder in den Fingern: das klassische Beispiel für eine periodische Funktion, die Sinus-Funktion. Kennt jeder, die horizontale “Welle” im kartesischen Koordinatensystem. Ausgehend von einer polaren Darstellung und einer komplexeren Sinus-Funktion werde ich hier im Folgenden einen räumlichen Blick auf eine eigentlich zweidimensionale Funktion werfen.

Weiterlesen

Schreibe einen Kommentar

Polynome mal anders

Gerade habe ich mich mit Tschebyschow-Polynomen beschäftigt. Das sind spezielle orthogonale Polynome, die in Mathematik und Physik für die Lösung gewisser Differentialgleichungen nützlich sind. Trockene Mathematik braucht hier nicht zu sein, ich möchte nur einmal gewonnene schöne Darstellungen zeigen.

Die Serie der Polynome ist:

Tschebyschow-Polynome in 3DT0(x) = 1             T1(x) = x
T2(x) = 2x2 – 1    T3(x) = 4x3 – 3x
T4(x) = 8x4 – 8x2 + 1
T5(x) = 16x5 – 20x3 + 5x
T6(x) = 32x6 – 48x4 + 18x2 – 1
T7(x) = 64x7 − 112x5 + 56x3 − 7x

Soweit, so unverdächtig. Schauen wir uns nun verschiedene Darstellungsmöglichkeiten an.

Weiterlesen

Schreibe einen Kommentar

3D-Plots beschneiden

Wenn Funktionswerte zu groß werden, können wir die grafische Darstellung beschneiden. Wie machen wir es geschickt, damit es auch noch gut aussieht? Wenn wir beispielsweise einen Surface-Plot zeichnen, die Oberfläche der Funktion durch sogenannte Patches darstellen, kann es etwas gezackt aussehen, statt gerade. Wie schlimm, richtet sich nach Anzahl der Samples, also der Teilpunkte: wählen wir mehr, so wird es feiner.

Schauen wir es uns am Beispiel an. Wir plotten einen Kegel und beschränken den Maximalwert der Höhe durch die Option restrict z to domain:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    grid,
    domain=-5:5, y domain=-5:5,
    xmin=-10, xmax=10,
    ymin=-10, ymax=10,
    zmin=0,
    restrict z to domain=0:5
]
    \addplot3 [surf] {sqrt(x^2 + y^2};
  \end{axis}
\end{tikzpicture}
\end{document
}
Kegel in 3D

Ziemlich ausgefranst. Wir können anders beschneiden durch eine Variante der genannten Option mit *, also restrict z to domain*=0:5, das wird glatter:

Weiterlesen

Schreibe einen Kommentar

Feature request mit Blume

Sag’s mit einer Blume, und Dein Ansinnen wird freundlicher aufgenommen.

Das tat ich spontan mit einem feature request an den Autor von pgfplots. Nun weiß ich, dass er generell gern auf Fragen antwortet und Neues implementiert und das Paket sehr gut pflegt. Umso mehr Grund für ein Blümchen. :-)

Wenn ich Funktionen mit Polarkoordinaten parametrisiere, insbesondere mit Rotations-Symmetrie, habe ich oft mit Winkelfunktionen zu tun, also mit den trigonometrischen Funktionen wie beispielsweise Sinus und Cosinus. Winkel kann man in Grad angeben, den Vollkreis von 0 bis 360 Grad durchlaufen, oder man verwendet Radiant, entsprechend von 0 bis 2*pi. pgfplots verwendet Grad. Wenn ich das weiß, gebe ich den Quellbereich eben in Grad an und gut ist es, wie in dieser ersten Blüte:

Funktion in 3D

Der Code hierfür ist:
Weiterlesen

Schreibe einen Kommentar

Dynamische Systeme, Bifurkationen, prozedurale Welten

Nachdem ich im vorangehenden Post erwähnte, dass ich auch pgfplots zur grafischen Ausgabe nutze, möchte ich hier ein paar Beispiele nennen.

Als Vorteile von pgfplots gegenüber Basis-TikZ nutze ich hier:

  • einfaches Plotten mit 3D-Koordinaten und Schrägbildansicht
  • Darstellung zugehöriger Koordinatenachsen
  • Verwenden von Farbverläufen
  • Einlesen von Dateien, falls die Daten extern berechnet wurden.

In jedem Fall kann man hier wieder Lua zum Berechnen der Daten verwenden. Lua generiert uns die TeX-Befehle zur Ausgabe, die in der pgfplots-Achsen-Umgebung verarbeitet werden.

Hier die Beispiele, einfach draufklicken, um zur zugehörigen Diskussion auf TeXwelt zu gelangen, wo man den vollständigen Quellcode findet.

Lorenz-Attraktor (Dynamisches System)

Während ich auf TeXwelt eine auf Python basierende Version postete, brachte Henri eines, was LuaTeX verwendet, daher zunächst sein Bild:

Lorenz-Attraktor

Von pgfplots nutzte ich neben der einfachen 3D-Darstellung die Fähigkeit zum durchscheinenden Plotten, so erhalte ich eine Dichte-Darstellung:

Lorenz-Attraktor

Und der Code, hat man einmal die Daten berechnen lassen, ist einfach:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      xmin = -25, xmax = 25,
      ymin = -25, ymax = 25,
      zmin =   0, zmax = 50,
      hide axis,
   
]
    \addplot3[mark=none, mesh, shader=interp, color=black, opacity=0.2]
      file { lorenz.dat };
  \end{axis}
\end{tikzpicture}
\end{document
}

Fraktale Landschaften (Grundansatz für Produktion prozeduraler Welten)

Zwischen benachbart liegenden Punkten werden neue Punkte bestimmt mit zufälligen, aber begrenzten Variationen, was am Ende eine bergige “Landschaft” ergibt. Die errechneten Punkte gebe ich mit Farben entsprechend ihrer Höhe aus, also blau für Meeresspiegelhöhe und darunter, grün für Berge und weiß ab “Schneegrenze”.

Fraktale Landschaft

Nächster Schritt: ein paar Startwerte vorgeben, um mit einer vordesignten Grobstruktur zu starten, wie etwa einer Insel im Wasser.

Feigenbaum-Diagram (Bifurkationen)

Ein Klassiker der Chaos-Theorie und eng verwandt mit der Mandelbrot-Menge. Auch hier wird Transparenz verwendet für einen Eindruck der Punktdichte.

Feigenbaum-Diagramm

Themen dieser Art schneide ich auf TeXwelt.de gern an. Dort fragen nicht nur Bachelor-Schreiber um Hilfe, sondern es hat sich auch eingebürgert, dass TeX-Kenner und TikZ-Freunde ihre Ideen als Fragen in den Raum stellen und oft selbst eine der Antworten dazu geben.

 

Schreibe einen Kommentar

Komplexe Fraktale mit TikZ

Neulich besann ich mich in nostalgischer Weise zurück an die Zeit der 80er, als ich auf einem 8-bit Kleincomputer Nächte hindurch Fraktale berechnete, angefangen mit dem “Apfelmännchen”. Unter dem Namen kennt man die Mandelbrot-Menge, eine sehr formenreiche Menge in der komplexen Zahlenebene. Das meinte ich mit komplex – ihre Struktur ist es aber auch. Faszinierend, dass innerhalb dieses chaotisch erscheinenden Konstrukts dennoch Ähnlichkeiten und Gesetzmäßigkeiten auftreten.

Wenn man früher einen Text über Fraktale schrieb, generierte man Grafiken mit speziellen Programmen, die man in sein Dokument hineinkopierte. Schreibe ich heute mit LaTeX einen Artikel über Fraktale, so könnte ich sie direkt im Dokument definieren und sie würden automatisch mit berechnet und im Text ausgegeben.

Das habe ich nun mal durchgezogen:

  • Berechnung des Fraktales durch einige eingebettete Lua-Zeilen
  • Ausgabe mit dem PGFPlots-Paket
  • Übersetzen mit LuaLaTeX

PGFPlots übernimmt gleich das Sampling, also das punktweise Durchgehen der Ebene als Ausgangswerte, Lua berechnet den jeweiligen Punkt, PGFplots färbt entsprechend ein und gibt aus. Wenn ich möchte, auch mit Achsen und Beschriftung.

Ich habe das einmal programmiert und auf TeXwelt gepostet, Christian brachte noch eine Verbesserung ein, so haben wir dieses Resultat:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8}
\usepackage{luacode}
\begin{luacode}
  function mandelbrot(cx, cy, max_iter, max)
    local x, y, xtemp, ytemp, squaresum, iter
    squaresum = 0
    x = 0
    y = 0
    iter = 0
    while (squaresum <= max) and (iter < max_iter) do
      xtemp = x * x - y * y + cx
      ytemp = 2 * x * y + cy
      x = xtemp
      y = ytemp
      iter = iter + 1
      squaresum = x * x + y * y
    end
    local result = 0
    if (iter < max_iter) then
        result = iter
    end
    tex.print(result);
  end
\end{luacode}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    colorbar,
    point meta max=30,
    tick label style={font=\tiny},
    view={0}{90}
]
    \addplot3 [surf, domain = -1.5:0.5, shader = interp,
      domain y = -1:1, samples = 200
] {
      \directlua{mandelbrot(\pgfmathfloatvalueof\x,
        \pgfmathfloatvalueof\y, 10000, 4)}
    };
  \end{axis}
\end{tikzpicture}
\end{document
}

Das ist sogar ein 3D-Plot, mit der Iterations-Zahl als dritte Dimension, die wir aber nur mit view={0}{90} als “Draufsicht” mit ihrer Farbigkeit darstellen. Wir erhalten mit der Standard-Colormap:

Mandelbrot-Menge

Mit kleiner Modifikation, der Code steht hier, erhalten wir eine verwandte Julia-Menge, diesmal mit anderer Einfärbung:

Julia-Menge

Nun kann man mit erhöhter Iterations-Zahl hinein zoomen, das benötigt mehr Rechenleistung. Doch dann kann man wieder hochperformante Tools wie FractInt zum Forschen verwenden und damit gefundene interessante Intervalle hiermit darstellen.

Schreibe einen Kommentar