我正在绘制一个特定范围内的相当简单的函数。该函数就是f(x) = 0.12 * sqrt(x)
。这是我到目前为止的 gnuplot“代码”:
set border linewidth 1.5
set style line 1 linecolor rgb '#0060ad' linetype 1 linewidth 2
set xrange [0:12000]
set yrange [0:13]
set xlabel 'Hours' offset 0,0.5
set ylabel 'Level' offset 1,0
set ytics 1
set xtics 2000
set tics scale 0.75
set key bottom right
set grid
f(x) = 0.12 * sqrt(x)
set terminal svg size 1920,1080 font 'Fira Code Nerd Font Mono,20'
set output 'sqrt.svg'
plot f(x) title 'Example Function' with lines linestyle 1
如果你看一下 svg(或者甚至只是使用默认的 qt 输出),该函数是一条从 0 到 x 轴上大约 200 的直线(查看图的最左下角),即使这个函数是不是一条直线。这会导致我添加的一些点在该区域偏移,需要我手动更改数据才能使它们看起来正确。
版本:
$ gnuplot --version
gnuplot 5.4 patchlevel 3
我不知道它为什么会这样做,尤其是为什么它只对较小的 x 值这样做。
这是我得到的图像,以防别人无法重现它(我已将 svg 转换为 png 并添加了背景层,但 svg 中的情节本身并没有什么不同):
答案1
这是一个不同的应用程序,但问题与pgfplots 上奇怪的平方根。
该sqrt(x)
函数在 0 处有垂直切线,当您以等距步长对其进行采样时,会显示不连续性x
。您可以通过设置(例如,set samples 1000
默认值为 100,show samples
会告诉您)来获得更好的近似值(除非您放大)。
smooth
不幸的是,据我所知,在 Gnuplot 中你不能应用函数绘图,所以这不是一个解决方案。pgfplots
你可以使用样条平滑,它确实几乎正确的事情。
或者以参数方式绘制,以便获得等间距的y
步骤,例如
gnuplot> set parametric
gnuplot> set trange[0:sqrt(12000)]
gnuplot> plot t*t, 0.12*t
答案2
就像 @campa 所说的那样,我猜想也可能是样本大小,尤其是在开始时(0...1000 左右)。计算机只能计算离散值并插入其余值,因此是直线。因此,这将对开始(变化最大的点)产生最大影响。
您可以通过手动增加第一个 x 值的分辨率来测试它。
在您对帖子进行编辑之前,您不仅向我们展示了 xrange,还展示了 x 的样本,这是关键部分。使用这两个值,您可以计算点之间的距离并计算 0 之后的第一个 x 值。将此值与您的图表进行比较将显示样本大小是否是问题所在。