使用fixedpointarithmeticTi钾Z 库

使用fixedpointarithmeticTi钾Z 库

我有一个semilogyaxiswithlog ticks with fixed point选项。我不喜欢的是 的标签1.013被截断为1.01。我尝试用/pgf/number format/precisionkey 来解决这个问题,但没有帮助。你知道哪里出了问题吗?

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{semilogyaxis}[log ticks with fixed point,xmin=0,xmax=400,ymin=1E-5,ymax=1E4,ytick={1E-5,6.1E-3,1.013,221,1E4},yticklabel style={/pgf/number format/precision=4}]

\end{semilogyaxis} 
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案1

默认情况下,/pgfplots/log ticks with fixed point使用以下命令打印数字:

\pgfqkeys{/pgf/number format}{fixed relative, precision=3}

但是,它接受一个参数,该参数作为选项输入,\pgfmathprintnumber并且可以覆盖这些默认值。因此,您的问题通常应该使用来解决log ticks with fixed point={precision=4}。不幸的是,据我所知,由于使用 PGF 库进行的计算中有效数字相对较少而导致的数值错误fpu,最低 y 刻度将显示为 0.000009999 而不是 0.00001,这不是很令人愉快。

为了解决这个问题,我提出了两种解决方案/pgfplots/log number format code(我倾向于前者)。

使用fixedpointarithmeticTiZ 库

\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepackage{fp}
\usetikzlibrary{fixedpointarithmetic}

\begin{document}

\begin{tikzpicture}
\begin{semilogyaxis}[
  log number format code/.code={%
    \begingroup
      \pgfset{fixed point arithmetic,
              number format/.cd, fixed relative, precision=4}%
      \pgfmathparse{exp(#1)}%
      \pgfmathprintnumber{\pgfmathresult}%
    \endgroup
  },
  xmin=0, xmax=400,
  ymin=1E-5, ymax=1E4,
  ytick={1E-5,6.1E-3,1.013,221,1E4},
  ]
\end{semilogyaxis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

fpu使用Ti直接计算Z 库

/pgfplots/log ticks with fixed point已经使用fpuTiZ 库,但它计算 y 刻度为 exp(nln(10)) 的相关值n. 计算链——一次乘法然后幂运算——由于计算中的有效数字较少fpu(使用 TeX\dimen寄存器来表示尾数),会导致错误。下面的代码具有略高的数字精度:它计算 exp(X), 在哪里X是刻度值的自然对数,作为 的参数提供/pgfplots/log number format code。计算越少,数值误差的积累就越少。这样,结果也令人满意——它与上面的截图相同。

\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}

\begin{tikzpicture}
\begin{semilogyaxis}[
  log number format code/.code={%
    \begingroup
      \pgfset{fpu, number format/.cd, fixed relative, precision=4}%
      \pgfmathparse{exp(#1)}%
      \pgfmathprintnumber{\pgfmathresult}%
    \endgroup
  },
  xmin=0, xmax=400,
  ymin=1E-5, ymax=1E4,
  ytick={1E-5,6.1E-3,1.013,221,1E4},
  ]
\end{semilogyaxis}
\end{tikzpicture}

\end{document}

PS:不要忘记设置pgfplots兼容级别(正如我在这里所做的那样\pgfplotsset{compat=1.16})。

相关内容