从 gnuplot 数据生成 pgfplots 图例

从 gnuplot 数据生成 pgfplots 图例

我在使用 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}

相关内容