当用来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 之前手动映射数据。