带有趋势线的散点图,带有三次多项式的曲线拟合方程

带有趋势线的散点图,带有三次多项式的曲线拟合方程

我正在尝试绘制一个带有 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}

相关内容