我在使用 pgfplots 排版非常小的数字时遇到了麻烦,例如6.82e-08
。我不知道问题是否在于它是一个非常小的数字,或者是否是因为与读取从 gnuplot 生成的变量数据的交互。
下面的示例将生成两个图。第一个图是从“外部”数据生成的,并让 gnuplot 生成指数回归。它将拟合变量保存在一个文件中,pgfplots 应该读取该文件并在图例中漂亮地打印出来。它对变量b
和按预期工作,c
但对不工作a
。
起初我以为这与数字未以科学计数法呈现有关,但强制通过它\pgfmathprintnumber[sci]
仍然输出错误,这让我相信问题出在 gnuplot 交互上。
我希望第一个图表与第二个图表具有相同的图例,但仍要生成它,因为我在宏中将其用于不同的数据集。我应该怎么做?
最小示例:
\documentclass{article}
\usepackage{pgfplotstable}
\begin{filecontents}{data.csv}
x, y
2, 0.000058
3, 0.001888
4, 0.058763
5, 1.78986
\end{filecontents}
\begin{document}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}
\addplot [raw gnuplot, smooth] gnuplot {
f(x)=(a)*(b^(c*x));
a=6.8e-8;
b=2.7;
c=3.4;
fit f(x) 'data.csv' using 1:2 via a,b,c;
plot f(x);
set print "data.csv.dat";
print a,b,c;
};
\addlegendentry{
\pgfplotstableread{data.csv.dat}\parameters
\pgfplotstablegetelem{0}{0}\of\parameters \pgfmathsetmacro{\paramA}{\pgfplotsretval}
\pgfplotstablegetelem{0}{1}\of\parameters \pgfmathsetmacro{\paramB}{\pgfplotsretval}
\pgfplotstablegetelem{0}{2}\of\parameters \pgfmathsetmacro{\paramC}{\pgfplotsretval}
$y=\pgfmathprintnumber[sci]{\paramA} \cdot \pgfmathprintnumber{\paramB}^{\pgfmathprintnumber{\paramC} \cdot x}$
}
\end{axis}
\end{tikzpicture}
\end{figure}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}
\addplot [raw gnuplot, smooth] gnuplot {
plot (6.82564001285694e-08)*(2.71554805209898^(3.41986746643527*x));
};
\addlegendentry{
$y=\pgfmathprintnumber{6.82564002501364e-08} \cdot \pgfmathprintnumber{2.71554805209898}^{\pgfmathprintnumber{3.41986746643527} \cdot x}$
}
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
结果:
数据.csv.dat。
6.82564001285694e-08 2.71565816582345 3.41972869952421
错误情节:
期望情节:
答案1
更改 gnuplot 输出可能是最简单的方法,并且可以规避 pgfplots 的精度限制。
a/10^floor(log10(a)),floor(log10(a))
在两个单独的列中提供科学记数法的各个部分。这些部分可以读入 pgfplots 并放入图例中。
\begin{tikzpicture}
\begin{axis}
\addplot [raw gnuplot, smooth] gnuplot {
f(x)=(a)*(b^(c*x));
a=6.8e-8;
b=2.7;
c=3.4;
fit f(x) 'data.csv' using 1:2 via a,b,c;
plot f(x);
set print "data.csv.dat";
print a/10^floor(log10(a)),floor(log10(a)),b,c;};
\addlegendentry{
\pgfplotstableread{data.csv.dat}\parameters
\pgfplotstablegetelem{0}{0}\of\parameters \pgfmathsetmacro{\paramAa}{\pgfplotsretval}
\pgfplotstablegetelem{0}{1}\of\parameters \pgfmathsetmacro{\paramAb}{\pgfplotsretval}
\pgfplotstablegetelem{0}{2}\of\parameters
\pgfmathsetmacro{\paramB}{\pgfplotsretval}
\pgfplotstablegetelem{0}{3}\of\parameters \pgfmathsetmacro{\paramC}{\pgfplotsretval}
$y=\pgfmathprintnumber{\paramAa}\cdot 10^{\paramAb} \cdot \pgfmathprintnumber{\paramB}^{\pgfmathprintnumber{\paramC} \cdot x}$
}
\end{axis}
\end{tikzpicture}