pgfplots/gnuplot 指数回归线的宏

pgfplots/gnuplot 指数回归线的宏

我正在尝试创建一系列具有指数回归的图,这些图是从逗号/制表符分隔的.csv文件自动生成的,并pgfplots借助gnuplot。当不使用宏时,我实现了所需的结果。

(注意:如果您想自己测试,您需要gnuplot安装并-shell-escape在编译时使用命令行参数。在pdflatex//xelatex上测试lualatex。)

\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]
\begin{center}
\begin{tikzpicture}
\begin{axis}[
    grid=major,
    ylabel=x,
    xlabel=y,
    ymin=-0.5, ymax=2.5, xmin=1.5, xmax=5.5
]
\addplot [raw gnuplot, color=red, no marks, smooth] gnuplot {
    f(x)=a*(b^(c*x));
    a=7e-8;
    b=2.7;
    c=3.4;
    fit f(x) 'data.csv' using 1:2 via a,b,c;
    plot [x=1.5:5.5] f(x);
};
\addplot [color=black, mark=*, only marks] table [col sep=comma] {data.csv};
\end{axis}
\end{tikzpicture}
\caption{sample caption text}
\end{center}
\end{figure}

\end{document}

结果是:

在此处输入图片描述

我想使用宏获得相同的结果,但以下方法不起作用。我像这样替换 y/x 标签、y/x 最小/最大值、数据文件路径和标题(代码与前面的示例基本相同):

\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}
\newcommand{\expchart}[8]{ % ylabel, xlabel, ymin, ymax, xmin, xmax, csvPath,   caption
\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
    \begin{axis}[
        grid=major,
        ylabel={#1},
        xlabel={#2},
        ymin={#3}, ymax={#4}, xmin={#5}, xmax={#6}
        ]
    \addplot [raw gnuplot, color=red, no marks, smooth] gnuplot {
        f(x)=a*(b^(c*x));
        a=7e-8;
        b=2.7;
        c=3.4;
        fit f(x) '{#7}' using 1:2 via a,b,c;
        plot [x={#5}:{#6}] f(x);
    };
    \addplot [color=black, mark=*, only marks] table [col sep=comma] {{#7}};
    \end{axis}
\end{tikzpicture}
\caption{{#8}}
\end{center}
\end{figure}
}

\expchart
{y}
{x}
{-0.5}
{2.5}
{1.5}
{5.5}
{data.csv}
{sample caption text}

\end{document}

结果是:

在此处输入图片描述

除了指数回归线之外,其他一切都一样。这是什么原因造成的?这可能与gnuplot外部程序有关,因此在处理宏中的变量时会遇到麻烦吗?我使用 是不是完全走错了路gnuplot?我应该使用其他东西吗?

答案1

Gnuplot 不喜欢在其输入中使用文字{}字符(它们保留用于复数)。

因此,删除{}gnuplot 输入中宏参数周围的对(线\addplot[...] gnuplot{...};),它就应该可以工作了。

(使用 gnuplot 5.1 CVS 快照版本测试,自行编译)

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\pgfplotsset{compat=1.12}
\begin{filecontents}{data.csv}
x,  y
2,  0.000058
3,  0.001888
4,  0.058763
5,  1.78986
\end{filecontents}
\begin{document}
\newcommand{\expchart}[8]{ % ylabel, xlabel, ymin, ymax, xmin, xmax, csvPath,   caption
\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
  \begin{axis}[
        grid=major,
        ylabel=#1,
        xlabel={#2},
        ymin={#3}, ymax={#4}, xmin={#5}, xmax={#6}
        ]
    \addplot [raw gnuplot, color=red, no marks, smooth] gnuplot {
        f(x)=a*(b^(c*x));
        a=7e-8; 
        b=2.7; 
        c=3.4; 
        fit f(x) '#7' using 1:2 via a,b,c; 
        plot [x=#5:#6] f(x); 
    };
    \addplot [color=black, mark=*, only marks] table [col sep=comma] {#7};
    \end{axis}
\end{tikzpicture}
\caption{{#8}}
\end{center}
\end{figure}
}

\expchart
{y}
{x}
{-0.5}
{2.5}
{1.5}
{5.5}
{data.csv}
{sample caption text}

\end{document}

在此处输入图片描述

相关内容