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 '18, 17:00

cis's gravatar image

cis
9.4k23254465
Akzeptiert-Rate: 29%

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 '18, 17:10) cis

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

(14 Feb '18, 17:12) cis

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

(14 Feb '18, 17: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 '18, 17:34

Ijon%20Tichy's gravatar image

Ijon Tichy
9.6k31227
Akzeptiert-Rate: 53%

bearbeitet 14 Feb '18, 19:02

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

(14 Feb '18, 18: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 '18, 19: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 '18, 22:27) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×280
×9

gestellte Frage: 14 Feb '18, 17:00

Frage wurde gesehen: 2,169 Mal

zuletzt geändert: 14 Feb '18, 22:27