Gnuplot 中的高斯峰不重叠

Gaussian peaks not overlapping in Gnuplot

我正在尝试使用 Gnuplot 在同一张图上绘制多个高斯函数,这是一件非常简单的事情。问题是峰不重叠,我得到以下结果,看起来它们有不同的峰,但实际上没有。我该如何解决这个问题?

首先,它有助于理解 gnuplot 如何生成函数图(或者实际上任何计算机程序必须如何生成函数图)。它必须将连续函数转换为某种离散表示。要绘制的数学函数在独立 (x) 轴上的各个点进行评估。这将创建一组 (x,y) 点。然后在这些点之间画一条线(想想 "connect the dots")。正如您想象的那样,使用的离散样本数量会影响曲线表示的准确程度以及曲线的平滑程度。

您注意到的问题是 gnuplot 中的默认样本量有点太小了。默认值(我相信)是可见 x 轴上的 100 个样本。您可以使用

调整样本数量(例如,到 1000)
set samples 1000

我做了一些高斯分布图来说明这一点。 (我粗略估计了你的高斯参数。)每个图都有不同数量的 samples:

注意如果样本量太小,线条会变得太参差不齐。即使是默认值 100 也太低了。设置为 1000 使其非常平滑。这可能比它需要的更多,但它有效。如果您使用的是生成位图图像(例如 PNG)的终端,那么您不需要比用于 x 轴绘图区域的像素宽度更多的样本。如果您要生成基于矢量的输出,那么只需选择 "looks right" 适合您在其中使用的内容即可。

有关更多信息,请参阅问题 Gnuplot x-axis resolution


顺便说一句,生成上述例子的代码是:

set terminal pngcairo size 640,480 enhanced

# Line styles
set style line 1 lw 2 lc rgb "blue"
set style line 2 lw 2 lc rgb "red"
set style line 3 lw 2 lc rgb "yellow"

# Gaussian function stuff
set yrange [0:1.1]
set xrange [-20:20]
gauss(x,a) = exp(-(x/a)**2)
eqn(a) = sprintf("y = e^{-(x/%d)^2}", a)

# First example (default)
set output "example1.png"
set title "100 samples (default)"
plot gauss(x,8) ls 1 title eqn(8), \
     gauss(x,2) ls 2 title eqn(2), \
     gauss(x,1) ls 3 title eqn(1)

# Second example (too low)
set output "example2.png"
set title "20 samples (too low)"
set samples 20
replot

# Third example (plenty high)
set output "example3.png"
set title "1000 samples (plenty high)"
set samples 1000
replot