pgfplots: Vektor(-feld) eines parametrischen Kreises

Tabellen und Grafiken erstellen und anordnen


guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

pgfplots: Vektor(-feld) eines parametrischen Kreises

Beitrag von guy.brush™ »

Hallo,

nachdem ich ueber die Feiertage und letzten Uni-Tage noch nicht geschafft habe, die "external" Library anzuschauen, tat sich (leider) kurz vor den Ferien ein neues Problem auf. Ich schaute mir "quiver plots" an und moechte an einen parametrisch geplotteten Kreis ein paar veranschaulichende Vektorpfeile anbringen.

Dies scheint leider so, wie ich das versuche, nicht zu funktionieren. Ich wuesste jetzt auch nicht, dass ich den Gradienten, in pgfplots (u, v), falsch bestimmt haette. Das Resultat ist meines Wissens nach falsch (ich hoffe, ich blamiere mich hier nicht bis auf die Knochen und das Resultat ist am Ende doch richtig ;)). Gerade einmal im Punkt (0,1) und ein paar Punkte weiter "rechts" sind die Vektorpfeilchen richtig, danach sind sie schon nicht mehr tangential und zeigen meines Wissens nach auch dann spaeter in die falsche Richtung.

Hier einmal der Code:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,calc,intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5}

\begin{document}

\begin{figure}[!ht]
  \centering 
  \begin{tikzpicture}
    \begin{axis}[axis equal,
	  axis lines=middle,
	  axis line style={->},
	  tick style={color=black},
           xtick=\empty,
	  ytick=\empty
	]
      \addplot[samples=20, domain=0:2*pi, quiver={u={cos(deg(x))}, v={-sin(deg(x))}, scale arrows=0.5},->,blue] ({sin(deg(x))}, {cos(deg(x))});
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\end{document}
Im Anhang findet ihr die Ausgabedatei, so wie es bei mir ausgespuckt wird. Zudem ein kleines fix gezeichnetes Bildchen, wie ich meine, dass der Output sein muesste. [Es kann sein, dass die Pfeile konventionsgemaess in die andere Richtung zeigen/laufen muessten, das weiss ich gerade aber nicht :).]

Woran koennte der fehlerhafte Output liegen?


Viele Gruesse,

\\ guy.brush
Dateianhänge
quiver_plots.pdf
(10.11 KiB) 420-mal heruntergeladen
quiver-plot.png
quiver-plot.png (5.39 KiB) 2159 mal betrachtet
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hi guy.brush,

Dein code ist soweit korrekt - bis auf eine folgenschwere Sache, die man wohl als UI-Problem von Pgfplots ankreiden darf: nach Definition der Anleitung wird 'x' innerhalb der expressions fuer 'u' und 'v' als die x respektive y *koordinate* des Datenpunkts interpretiert -- und *nicht* als der Parameter, der gesampelt wurde.

Konkret heisst dass, das
\addplot[samples=20, domain=0:2*pi, quiver={u={y}, v={-x}, scale arrows=0.5},->,blue] ({sin(deg(x))}, {cos(deg(x))});
Dein Problem loest. Zweifelsohne doof, weil hier 'x' in derselben Zeile mit zweierlei Bedeutungen vorkommt.

pgfplots ist klueger, wenn die Sampling variable 't' heisst wie in folgendem Codefragment:
\addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}, scale arrows=0.5},->,blue] ({sin(deg(t))}, {cos(deg(t))});
Dabei passiert dann auch genau das, was Du Dir gewuenscht hast.

Mit liebem Gruss

Christian

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Wenn ich richtig gesehen habe, dann ist das Beispiel gleich in die pgfplots Anleitung gewandert. Die Gelegenheit möchte ich doch mal nutzen um dir zu danken: fürs Paket und den guten Support.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


guy.brush™
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 8. Aug 2010, 19:43
Wohnort: Earth

Beitrag von guy.brush™ »

Hallo,

vielen, vielen Dank Christian fuer deine Hilfe :). Ich wollte schon frueher antworten, aber ueber die Feiertage habe ich das immer weiter nach hinten geschoben.

Ich finde die zweite Loesung mit dem Parameter t wesentlich besser.

Ich habe evtl. einen kleinen Bug gefunden. Ich weiss mir zwar zu helfen (durch angeben von ymin, ymax, xmin, xmax), aber vielleicht ist es ja in der Tat ein Bug. Betrachte(t) dazu einmal folgenden Code:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,calc,intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5}

\begin{document}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    \begin{axis}[axis equal,
     axis lines=middle,
     axis line style={->},
     tick style={color=black},
     xtick=\empty,
     ytick=\empty]      
      \addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}, scale arrows=0.5},->,blue] ({sin(deg(t))}, {cos(deg(t))}); 
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    \begin{axis}[%axis equal,
     axis lines=middle]      
      \addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}, scale arrows=0.5},->,blue] ({sin(deg(t))}, {cos(deg(t))}); 
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    \begin{axis}    
      \addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}, scale arrows=0.5},->,blue] ({sin(deg(t))}, {cos(deg(t))}); 
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    \begin{axis}[axis equal,
     axis lines=middle]      
      \addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}},->,blue] ({sin(deg(t))}, {cos(deg(t))}); 
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\begin{figure}[!ht]
  \centering
  \begin{tikzpicture}
    \begin{axis}[axis lines=middle]      
      \addplot[samples=20, domain=0:2*pi, variable=\t,quiver={u={cos(deg(t))}, v={-sin(deg(t))}},->,blue] ({sin(deg(t))}, {cos(deg(t))}); 
      \addplot[samples=100, domain=0:2*pi] ({sin(deg(x))}, {cos(deg(x))});
    \end{axis}
  \end{tikzpicture}
\end{figure}

\end{document}
Ich habe hier das Ganze 5x plotten lassen. In 3-4 Faellen wird hier die clip-Box um das Schaubild herum nicht gross genug gelassen bzw. die Achsen werden nicht gross genug gezeichnet, da die blauen Vektorpfeile etwas beschnitten werden, zumindest meist der ganz oben. Dort, wo "axis equal" fehlt (zumindest im 2. Plot), ist auch links ein Pfeil davon betroffen. Beim vorletzten Plot wird maximal ein ganz klein wenig beschnitten so, dass es kaum auffaellt. Ausgeloest wird es wohl, wenn man die Achsen mittig zeichnen laesst. Ich sehe gerade, dass es auch den unteren Pfeil betrifft (und im 2. Plot auch den rechten). Im 5. Plot kann ich links und rechts jetzt nichts fehlendes erkennen - entweder wurde dort nichts abgeschnitten oder es bewegt sich in einem aeusserst kleinen Rahmen, was dort weggeschnitten worden ist.

Ich hoffe, du verstehst, was ich meine. Sonst frag einfach noch einmal nach und ich versuche, es genauer zu beschreiben bzw. die "kritischen Stellen" zu markieren.


Mein zweiter Punkt betrifft den Eintrag im manual (beim Plot im Handbuch siehst du im Uebrigen auch das "Abschneideproblem"): Beim reinen Abtippen der Funktion, als ich sie plotten lassen wollte, ist mir nicht aufgefallen, dass der Kreis ueblicherweise durch (cos, sin) parametrisiert wird und nicht durch (sin, cos). Dies wollte ich nur erwaehnen, falls du es als aesthetischer empfinden solltest, hier der Konvention zu folgen. Dann muesste man eben nur die Ableitungen und die Parameter der Funktion vertauschen beim plotten, dann zeigen die Pfeile auch in die wohl eher uebliche Richtung.


Viele Gruesse,

\\ guy.brush
Arch Linux - KDE - TeXLive - Kile - \me = Advanced Newbie

Interessensschwerpunkte: Mathematik- und Formelsatz sowie mathematische (Mikro-)Typographie
Offenes Problem: negierte \xarrow-Pfeile beliebiger Länge

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hallo guy.brush,

danke fuer den Bericht und Dein positives Feedback!

Du hast recht, die Vektorpfeile werden nicht mit in den Clippath einberechnet... ich notiere mir das als bug. Vermutlich hilft da momentan nur entweder 'clip=false' oder 'enlargelimits' ...

Ich bin Deiner Anregung mit dem Beispiel im Manual gefolgt, danke!

Mit liebem Gruss

Christian

Antworten