我正在尝试绘制一个带有 3 阶多项式曲线拟合趋势线的散点图。我已经能够在 excel 中创建带有趋势线的所需图表。我尝试使用 latex/tiktz 绘制相同的图表,但我无法在 latex 图表中获得趋势线。预期图表如下
虽然我的乳胶代码中的散点图图像如下所示
图像的乳胶代码如下
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ enlargelimits=false,
]
\addplot+[
color=black,
only marks,
scatter,
mark=halfcircle*,
mark size=2.9pt
]
table[meta=SPL(dB)]{data2.dat};
\addplot [ smooth,thick, red]
gnuplot [raw gnuplot] { % "raw gnuplot" allows us to use arbitrary gnuplot commands
f(x) = a*x^3+b*x^2+c*x+d; % Define the function to fit
a=0; b=0,c=0,d=0; % Set reasonable starting values here
% Select the x-range, the file, the columns (indexing starts at 1) and the variables for fitting
fit [0:8000] f(x) 'data2.dat'% u 1:2 via a,b,c,d;
plot [x=0:8000] f(x); % Specify the range to plot
};
%table[ y={create col/linear regression={y=SPL(dB)}}]{data2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
我希望 latex 能够通过自动拟合平滑曲线的最大点来绘制曲线,我不确定这里需要使用什么样的代码。
图表中使用的数据文件包含以下数据:- data2.dat 的内容如下
Frequency(Hz) SPL(dB)
50 63.8
100 65.5
200 71.7
300 74.5
400 78.1
500 83.8
600 82.8
700 85.9
800 88
900 87.8
1000 87.1
1500 84.8
2000 93.8
2500 95.1
3000 93.3
3500 89.1
4000 89
4500 86
5000 83.3
5500 84.7
6000 81.2
6500 85.4
7000 80.3
7500 83.3
8000 81.7
答案1
你的 Gnuplot 代码中有几个错误。我不是专家,但与向 pgfplot 图例添加值并进行一些测试:
- 每个变量声明之间都需要一个分号,而不是逗号,所以是
a=1; b=2;
,而不是a=1, b=2
。 您还需要为 a、b、c、d 设置非零值。设置为零时,您会在文件中收到此警告
.log
:Warning: Initial value of parameter 'a' is zero. Warning: Initial value of parameter 'b' is zero. Warning: Initial value of parameter 'c' is zero. Warning: Initial value of parameter 'd' is zero. Please provide non-zero initial values for the parameters, at least of the right order of magnitude. If the expected value is zero, then use the magnitude of the expected error. If all else fails, try 1.0
您需要
fit f(x) 'data2.dat' using 1:2 via a,b,c,d;
,即删除域设置,并指定列和拟合参数。
当然,由于您使用的是 Gnuplot,因此您需要在shell-escape
启用的情况下进行编译。
\documentclass{article}
\usepackage{pgfplots} % loads tikz which loads graphicx
\begin{document}
\begin{tikzpicture}
\begin{axis}[ enlargelimits=false,
]
\addplot+[
color=black,
only marks,
scatter,
mark=halfcircle*,
mark size=2.9pt
]
table[meta=SPL(dB)]{data2.dat};
\addplot [thick, red]
gnuplot [raw gnuplot] { % "raw gnuplot" allows us to use arbitrary gnuplot commands
f(x)=a*x^3+b*x^2+c*x+d; % Define the function to fit
% set initial parameter values
% make them non-zero
% semi-colon after every one
a=0.0001;
b=0.0001;
c=0.1;
d=80;
% Select the x-range, the file, the columns (indexing starts at 1) and the variables for fitting
% specify columns and fitting variables
% don't specify range
fit f(x) 'data2.dat' using 1:2 via a,b,c,d;
plot [x=0:8000] f(x); % Specify the range to plot
};
\end{axis}
\end{tikzpicture}
\end{document}