PGFPlots: Logarithmische Achsen und Skalierung

PGFPlots: Logarithmische Achsen und Skalierung

Ich versuche, einige Daten zu zeichnen, bei denen die X-Achse logarithmisch ist. Die Daten reichen von ~30 Mikrosekunden bis zu 10 Millisekunden. Es sieht viel sauberer aus, wenn die X-Ticks so aussehen

{0.1 ms, 1 ms, 10 ms}

als

{10^-4 s, 10^-3 s, 10^-2 s}.

Mit anderen Worten möchte ich, dass meine Teilstrichbeschriftungen als Festkommazahlen (also nicht als Exponentialfunktionen) und skaliert (mit 1000 multipliziert) dargestellt werden.

Um diesen Effekt zu erzielen, habe ich versucht,

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{semilogxaxis}
    [xmin=1e-6, xmax=1e-3, domain=1e-6:1e-3,
    scaled x ticks=real:1e-3,
    xtick scale label code/.code={},
    log ticks with fixed point]
    \addplot {x};
  \end{semilogxaxis}
\end{tikzpicture}
\end{document}

aber logarithmische Achsen scheinen die Anweisungen für „skalierte x-Teilstriche“ zu ignorieren. Für jede Hilfe wäre ich sehr dankbar.

Danke,

Antwort1

Es scheint, als ob Sie die x-Koordinaten neu skalieren möchtenohneExtrahieren eines gemeinsamen Faktors. Der scaled x ticksHauptanwendungsfall dieser Funktion besteht darin, einen gemeinsamen Tick-Faktor zu generieren, der in einen Knoten eingefügt wird ... und tatsächlich hat pgfplots keine integrierte Unterstützung für scaled ticksund Log-Achsen, da dies normalerweise kein Anwendungsfall ist.

Eine Neuskalierung der x-KoordinatenIstein Anwendungsfall und lässt sich ganz einfach implementieren mithilfe von x filter:

\documentclass{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    xmode=log,
    log ticks with fixed point,
    % for log axes, x filter operates on LOGS.
    % and log(x * 1000) = log(x) + log(1000):
    x filter/.code=\pgfmathparse{#1 + 6.90775527898214},
]
\addplot table {
0.0001 10
0.001 20
0.01 15
};
\end{axis}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Das Problem liegt nicht an der logarithmischen Achse an sich, sondern am log ticks with fixed pointStil, der diese scaled x ticksOption ignoriert.

Hier ist eine leicht modifizierte Version, die prüft, ob die Skalierung aktiv ist und diese auf die Fixpunkt-Tick-Beschriftungen anwendet. Es gibt jedoch einen Nachteil: Dies funktioniert nicht, wenn Sie eine logarithmische Y-Achse mit einer anderen Skalierung verwenden. Ich denke, es wäre gut, wenn Sie einFehlerberichtdafür.

\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{units}

\makeatletter
\pgfplotsset{
    /pgfplots/log ticks with fixed point/.style={
        /pgfplots/log number format basis/.code 2 args={
            \begingroup
            \edef\pgfplots@exponent{##2}%
            \pgfkeysalso{/pgf/fpu}%
            % configure the style to avoid crap like
            % 10,000.2  or 0.000999937 :
            \pgfqkeys{/pgf/number format}{%
                fixed relative,
                precision=3,
            }%
            \ifdim##1pt=10pt
                \def\pgfplots@baselog{2.30258509299405}%
            \else
                \pgfmathparse{ln(##1)}%
                \let\pgfplots@baselog=\pgfmathresult
            \fi
            \ifdefined\pgfplots@scaled@ticks@x@arg\pgfmathfloatparsenumber{\pgfplots@scaled@ticks@x@arg}\else\def\pgfmathresult{1}\fi%
            \pgfmathparse{\pgfmathresult*exp(\pgfplots@exponent*\pgfplots@baselog)}%
            \pgfmathprintnumber[#1]\pgfmathresult
            \endgroup
        },
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    xmode=log,
    log ticks with fixed point,
    scaled x ticks=real:1e3
]
\addplot table {
0.0001 10
0.001 20
0.01 15
};
\end{axis}
\end{tikzpicture}
\end{document}

verwandte Informationen