Verwandt mit: pgfplots-fehler-bei-listen-verwendung


alt text

Ich habe hier einen Plot. Ich möchte, dass statt '1pi' bzw. '-1pi', wie üblich, 'pi' bzw. '-pi' angezeigt wird.

Dazu habe ich das Beispiel zur Fallunterscheidung mit ifdim aus dem pgfplots-Handbuch (S.319) rausgesucht.

Öffne in Overleaf
xtick/.expanded = {\xticklist},           
xticklabel={%
\ifdim\tick pt =3.14159 pt $\pi$%
\else%
   \ifdim\tick pt =-3.14159 pt $-\pi$%
   \else%
   \pgfmathparse{\tick / pi}%
   $\pgfmathprintnumber[precision=0]{\pgfmathresult}\pi$%
   \fi
\fi},

Nun habe ich aber das Problem, dass ich den zuvor erzeugten Listenwert '3.14159' reinschreiben, also kennen muss. Wenn ich einfach pi an diese Stelle schreibe funktioniert es nicht.

Was kann ich da machen?

Öffne in Overleaf
%\documentclass[]{article}
\documentclass[border=5mm, varwidth]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}

\begin{document}

% Reichweite der Ticks festlegen
\def\Range{-6,...,6}
% ticklist erstellen
\newcommand{\xticklist}{}% Name reservieren
\let\xticklist=\empty% Liste erstellen
\makeatletter
\foreach \n  in \Range
{
\pgfmathparse{\n*pi}%
  \ifx\empty\xticklist{} \protected@xdef\xticklist{\pgfmathresult}%
  \else \protected@xdef\xticklist{\xticklist,\pgfmathresult}%
  \fi
}
\makeatother
Anzeigen: \xticklist

\begin{tikzpicture}[]
\begin{axis}[enlarge y limits={0.5,upper}, % kein Effekt
axis lines=middle, 
xlabel=$x$,xlabel style={anchor=north},
ylabel=$y$,ylabel style={anchor=east},
x axis line style = {-latex}, y axis line style = {-latex},
%
xtick/.expanded = {\xticklist},           
xticklabel={%
\ifdim\tick pt =3.14159 pt $\pi$%
\else%
   \ifdim\tick pt =-3.14159 pt $-\pi$%
   \else%
   \pgfmathparse{\tick / pi}%
   $\pgfmathprintnumber[precision=0]{\pgfmathresult}\pi$%
   \fi
\fi},
]
\addplot[domain=-10:10, samples=300] {sin(deg(x))}; 
\end{axis}
\end{tikzpicture}

\end{document}

gefragt 14 Feb, 11:00

cis's gravatar image

cis
8.4k16172270
Akzeptiert: 69%

Hat sich erledigt. Kann man etwa so machen:

xtick/.expanded = {\xticklist}, xticklabel={% \pgfmathsetmacro{\piWert}{pi} \ifdim\tick pt =\piWert pt $\pi$% \else% \ifdim\tick pt =-\piWert pt $-\pi$% \else% \pgfmathparse{\tick / pi}% $\pgfmathprintnumber[precision=0]{\pgfmathresult}\pi$% \fi \fi},

(14 Feb, 11:10) cis

Blöd finde ich nur diese Unterscheidung mit diesem ifdim und diesen Punkten pt dann...

(14 Feb, 11:12) cis

Eigentlich hatte ich ja bereits darauf hingewiesen, dass pgf auch Vergleiche in mathematischen Ausdrücken bietet …

(14 Feb, 11:35) Ijon Tichy

pgf bietet selbst Vergleiche innerhalb von Ausdrücken. Man findet entsprechendes in Kapitel 89 der pgf-Anleitung. Im Beispiel genügt:

Öffne in Overleaf
xticklabel={%
   $\pgfmathparse{abs(\tick) == pi ? ( \tick < 0 ? "-" : "" ) : int(\tick / pi) }%
   \pgfmathresult\pi$%
}

Man kann den Ausdruck auch als

Öffne in Overleaf
xticklabel={%
   $\pgfmathparse{ \tick == -pi ? "-" : ( \tick == pi ? "" : int(\tick / pi) ) }%
   \pgfmathresult\pi$%
}

schreiben. Vorn steht jeweils die Bedingung, nach dem Fragezeichen kommt der Fall, dass die Bedingung zutrifft, nach dem Doppelpunkt der Fall, dass die Bedingung nicht zutrifft.

Wenn also \tick = -pi ist (der Vergleichsoperator verwendet == nicht =!) dann wird \pgfmathresult zu dem String - (Minuszeichen). Bei \tick = pi dagegen ein Leerstring. In allen anderen Fällen wird der Integerwert von \tick / pi verwendet.

Insgesamt führt dann beispielsweise:

Öffne in Overleaf
\documentclass[border=5mm, varwidth]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

% Reichweite der Ticks festlegen
\def\Range{-6,...,6}
% ticklist erstellen
\newcommand{\xticklist}{}% Name reservieren
\let\xticklist=\empty% Liste erstellen
\makeatletter
\foreach \n  in \Range
{
\pgfmathparse{\n*pi}%
  \ifx\empty\xticklist{} \protected@xdef\xticklist{\pgfmathresult}%
  \else \protected@xdef\xticklist{\xticklist,\pgfmathresult}%
  \fi
}
\makeatother
Anzeigen: \xticklist

\begin{tikzpicture}[]
\begin{axis}[enlarge y limits={0.5,upper}, % kein Effekt
axis lines=middle, 
xlabel=$x$,xlabel style={anchor=north},
ylabel=$y$,ylabel style={anchor=east},
x axis line style = {-latex}, y axis line style = {-latex},
%
xtick/.expanded = {\xticklist},           
xticklabel={%
   $\pgfmathparse{ \tick == -pi ? "-" : ( \tick == pi ? "" : int(\tick / pi) ) }%
   \pgfmathresult\pi$%
},
]
\addplot[domain=-10:10, samples=300] {sin(deg(x))}; 
\end{axis}
\end{tikzpicture}

\end{document}

zu:

-1 und 1 ersetzt

Manchmal werden scharfe Vergleiche mit == allerdings knapp daneben liegen. Dann muss man ggf. entweder zuerst runden oder unscharfe Vergleiche der Art (\tick > (0.999 * pi)) && (\tick < (1.001 * pi))) ? … : … verwenden – oder auf Lua-Code ausweichen.

Permanenter link

beantwortet 14 Feb, 11:34

Ijon%20Tichy's gravatar image

Ijon Tichy
7.7k11019

bearbeitet 14 Feb, 13:02

Puh, schwere Kost diese Syntax. Da muss man sich erstmal dran gewöhnen. :)

(14 Feb, 12:32) cis

@cis: An die Syntax kann man sich gewöhnen. Schwieriger finde ich das Hantieren mit Strings und Zahlen innerhalb von Ausdrücken. In dem Beispiel war es ja noch einfach. Wenn man Zahlen allerdings auf eine bestimmte Anzahl an Stellen runden und noch irgendwelche Schweinereien damit anstellen will, dann muss man sich ganz schön das Hirn verbiegen. Da vergeht mir dann die Lust. Dann denke ich lieber über passenden Lua-Code nach.

(14 Feb, 13:06) Ijon Tichy

Stimmt, eigentlich sogar ganz ok. Bei meinem eigentlichen Bsp. bin ich jetzt auf sowas gekommen:

xticklabel = {% \pgfmathsetmacro{\n}{int((\tick-1.2)/pi)}% \pgfmathparse{ \n < 0 ? "\approx -" : (\n == 0 ? "0" : (\n == 1 ? "\approx" : "\approx \n")) }

(14 Feb, 16:27) cis
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×263
×8

Frage gestellt: 14 Feb, 11:00

Frage wurde angeschaut: 754 Mal

Zuletzt aktualisiert: 14 Feb, 16:27