我正在尝试创建一系列具有指数回归的图,这些图是从逗号/制表符分隔的.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}