PGFPlots: ejes logarítmicos y escalamiento

PGFPlots: ejes logarítmicos y escalamiento

Estoy intentando trazar algunos datos donde el eje X es logarítmico. Los datos van desde ~30 microsegundos hasta 10 milisegundos. Se ve mucho más limpio que las x-ticks parezcan

{0.1 ms, 1 ms, 10 ms}

que

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

En otras palabras, me gustaría que mis etiquetas de ticks se presentaran en punto fijo (es decir, no como exponenciales) y escaladas (multiplicadas por 1000).

Para lograr este efecto, he intentado usar

\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}

pero los ejes logarítmicos parecen ignorar las instrucciones de "marcas x escaladas". Cualquier ayuda sería muy apreciada.

Gracias,

Respuesta1

Parece como si quisieras cambiar la escala de las coordenadas x.sinextrayendo algún factor común. La scaled x tickscaracterística tiene el caso de uso principal de generar un factor de tick común que se coloca en algún nodo... y, de hecho, pgfplots no tiene soporte incorporado para scaled ticksejes de registro, ya que normalmente no es un caso de uso.

Sin embargo, reescalar las coordenadas xesun caso de uso, y es bastante sencillo de implementar mediante 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}

ingrese la descripción de la imagen aquí

Respuesta2

El problema no está en el eje logarítmico per se, sino en el log ticks with fixed pointestilo, que ignora la scaled x ticksopción.

Aquí hay una versión ligeramente modificada que verifica si la escala está activa y la aplica a las etiquetas de marca de punto fijo. Sin embargo, existe un inconveniente: esto no funcionará si utiliza un eje y logarítmico con una escala diferente. Creo que sería bueno si pudieras abrir uninforme de errorpara esto.

\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}

información relacionada