大负值的奇怪轴标签

大负值的奇怪轴标签

当用来pgfplots绘制某些值时,我的轴标签“卡”在轴的一侧(参见下图的右下角)。

原始图表包含更多的数据点,这使其变得更加丑陋。

我将其简化为以下三个数字:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot coordinates { (-323573.5, -327215.79) (-323572.1, -327210.13) (-323572.1, -327206.85) };
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案1

这里发生的情况是 pgfplots 丢失了大量的精度:它“放大”到数据范围 x=[-323573.5:-323572.1]。这个“放大”意味着计算最大最小值,这意味着几乎所有计算的数字都丢失了(“取消”)。这尤其糟糕,因为至少部分计算是在 TeX 中进行的,并且其相对精度(即可用数字的数量)对于这个数据范围来说太小了。

解决方案是使用精度更高的工具来转换数据范围,然后让 TeX 计算绘图并稍后重新映射刻度标签。“转换”、“计算”、“重新映射”这些步骤通常由 pgfplots 自行完成,但由于其精度有限,因此无法完成。

事实上,我们可以尝试在 TeX 中配置必要的“转换”步骤,但我担心它会失去太多的精度,以至于不清楚描述是否正确。

我尝试使用 lua 数学引擎 ( 1.12lua backend版附带pgfplots) 的 lua 原型。它似乎可以工作:

\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    xticklabel style={rotate=45,anchor=east},
    xticklabel={\pgfluamathparse{1e-5*(\tick-323573)}\pgfmathprintnumber[precision=6]\pgfmathresult},
    yticklabel={\pgfluamathparse{1e-5*(\tick-327215)}\pgfmathprintnumber[precision=6]\pgfmathresult},
    scaled x ticks=manual:{$\cdot 10^5$}{\def\pgfmathresult{#1}},
    scaled y ticks=manual:{$\cdot 10^5$}{\def\pgfmathresult{#1}},
]
\addplot+[
    x filter/.expression={x+323573},
    y filter/.expression={y+327215},
]coordinates { (-323573.5, -327215.79) (-323572.1, -327210.13) 
(-323572.1, -327206.85) };
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

此解决方案表明您的应用程序超出了限制pgfplots:我添加了手动代码

  • 坐标变换(x filter/.expression支持lua backend,因此在lua中以双精度执行)
  • 刻度标签的逆变换。我使用了(目前未记录)\pgfluamathparse的一部分lua backend,因为我相信fpu随附的pgfplots无法以合理的精度计算这一点。
  • 1e-5刻度缩放:我添加了刻度刻度标签来记录刻度标签显示中的因素

但是,此解决方案目前缺乏对的支持xtick:您需要提供xtick转换后的坐标。

您可以尝试使用此原型。也许您想在将数据包含在 pgfplots 之前手动映射数据。

相关内容