我尝试在 pgfplots 中绘制数据。我的数据文件有 1001 个点,范围(x 轴)从 2499999500 到 2500000500,因此步骤为 1。我在日志文件中收到消息“Package pgfplots 警告:x 轴的轴范围几乎为空;将其扩大(它是 [2499999500.0000000:2500000500.0000000])...”,并绘制了一条直线,轴限制范围从 2e9 到 3e9,使用xmin = ...
等覆盖它们没有帮助。有什么想法可以解决吗?
文件 test.tex:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=2499999500,
xmax=2500000500,
]
\addplot+ table [x index=0, y index=1] {testdata.dat};
\end{axis}
\end{tikzpicture}
\end{document}
文件 testdata.dat:
2499999500 0
2500000000 1
2500000500 0
答案1
这不是一个答案,但解决方法是使用如下表达式:
\addplot+ table [x expr=\thisrow{x}-2500000000] {\mytable};
从数据集中减去一个较大的常见数字。这仍然使用 pgf 的数学引擎,并且适用于您的小测试用例。
\documentclass[border=1mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{testdata.dat}
2499999500 0
2500000000 1
2500000500 0
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xtick=data, xticklabels from table={testdata.dat}{[index]0}]
\addplot+ table [x expr=\thisrowno{0}-2500000000] {testdata.dat};
\end{axis}
\end{tikzpicture}
\end{document}
对于间距很近的数据,这种方法仍然行不通。FPU 引擎的精度可以用以下方法显示:
\pgfkeys{/pgf/fpu=true}
\pgfmathparse{2500000400 - 2500000500}
\pgfmathprintnumber{\pgfmathresult}
\pgfkeys{/pgf/fpu=false}
当第 8 位发生变化时,会打印零。因此,我建议使用 pgfmanual 中建议的 gnuplot 或在外部预处理数据集。
或者说,该fp
包更适合这个问题,因为它使用固定点进行操作。我不知道如何将其与 pgfplots 集成。
更新:
虽然 LaTeX 的精度有限,但使用 LuaTeX 进行计算却没有问题,而且结果相当不错。如果使用 LuaTeX 运行,以下示例将产生正确的输出:
\documentclass[tikz,preview]{standalone}
\usepackage{tikz,pgfplots,pgfplotstable}
\pgfplotsset{compat=1.8}
\begin{document}
\pgfplotstableread
{
x y
2499999500 1
2499999501 2
2499999502 3
2499999503 4
2499999504 5
2499999505 6
2499999506 7
2499999507 8
2499999508 9
2499999509 10
}\mytable;
\begin{tikzpicture}
\begin{axis}
\addplot+ table [x expr=\directlua{tex.print(\thisrow{x}-2499999500)},y=y] {\mytable};
\end{axis}
\end{tikzpicture}
\end{document}