【问题标题】:Gnuplot smooth curve through frequency points + filled area under curveGnuplot通过频率点平滑曲线+曲线下的填充区域
【发布时间】:2026-01-30 19:10:01
【问题描述】:

我是一个 gnuplot 新手,遇到以下情况。基于this我有一个gnuplot脚本如下:

clear
reset
set key off
set border 3

set style fill solid 1.0 noborder

bin_width = 0.01;
set boxwidth bin_width absolute

bin_number(x) = floor(x/bin_width)

rounded(x) = bin_width * ( bin_number(x) + 0.5 )

plot '1000randomValuesBetween0and1.dat' using (rounded($1)):(1) smooth frequency

这是一个很好的第一步;但我希望通过计算频率产生的点有一条平滑的曲线。 填充曲线在两个方面缺乏我想要的东西。首先它没有被平滑(我更喜欢贝塞尔曲线,它在 with 之后不可用);其次,填充是以一种相当出乎意料的方式完成的,这不符合我的需要(对我来说出乎意料)。看这张图

提供更多背景信息:我最终想用它来生成 使用 gnuplot 绘制小提琴图,而无需事先进行分箱,因此我可以给我的脚本一个单列数据文件,然后就可以开始了。

编辑:我尝试将this demo 中的“正常”密度图作为另一个第一步,但我失败了;我在文档中读到带宽应该是 1/#points 所以它 在我的情况下应该是 0.001 这意味着我试过这个:

set border 3 front lt black linewidth 1.000 dashtype solid
set style increment default
set style data filledcurves 
set xtics border in scale 0,0 nomirror norotate  autojustify
set xtics  norangelimit 0.00000,0.5,1.0
set title "Same data - kernel density" 
set title  font ",15" norotate

plot 'random01.dat' using 1:(1) smooth kdensity bandwidth 0.001 with filledcurves above y lt 9

这导致了这张图片:。 不设置带宽或更低/更高的值并不能解决问题。 该图指定 使用 1:(1) 因为我只有一个列,所以根据文档,第一个值应该是这个列,因为第二个值将指定一个权重,应该是 1/#根据文档点。

EDIT2:将带宽设置为理想值或根本不设置它总是会产生相同的结果,除了 y 轴的比例会随着权重的改变而改变。

我的数据是 0 到 1 之间的 1000 个值(出于测试目的随机创建)。

这里是新剧情

EDIT3:缩小可能会显示问题的另一个方面,因为该图似乎超出了给定值的区间(我检查了这些值,没有示例 1)。这是图表:

【问题讨论】:

  • 您误读了文档。 1/N 不是带宽,它是归一化的统一权重。您显示的图看起来带宽设置得太低了。您的数据中值的范围是多少?我建议让程序为您计算“理想”带宽,如果您认为它太大,然后再调整它。理想值存储在 GPVAL_KDENSITY_BANDWIDTH 中。
  • 我真的看错了!但不幸的是,不指定带宽或将其设置为理想值仍然会产生奇怪的结果。我在 0 和 1 之间随机创建了 1000 个值。将权重更改为 0.001(或任何其他值没有任何效果)。我会用情节更新我的问题。
  • 好的,我认出了一件我以前没有看到的东西,因为我从未缩小过;如果我缩小它表明“真实”曲线超出了 0 和 1;我仔细检查了我的值,确实没有值 1。
  • 预计会超出数据的末尾。 kdensity 函数将您的分布近似为高斯的总和,每个高斯就其性质而言在两侧都延伸到无穷大。你的 EDIT3 情节对我来说看起来很合理。你看到的“同样的问题”是什么?
  • 哦哇...你完全正确;解决了这个问题!抱歉,我对由此产生的密度函数估计的性质思考缓慢;我真的应该早点意识到这一点!所以我只需要找到一个合适的启发式方法来切割我的情节来美化它们。非常感谢您的耐心等待!如果您将问题下的第一条评论包含在您的答案中,我很乐意接受它作为解决方案!

标签: gnuplot violin-plot


【解决方案1】:

gnuplot 分发包中包含的演示“violinplot.dem”也可在线获取,展示了如何使用“平滑 k 密度”和“使用填充曲线”组合应用于未分箱数据来执行您想要的操作。

在线版本:violin plot demo

注意事项:

您误读了文档。 1/N 不是推荐的带宽,它是归一化的统一权重。您最初显示的图看起来带宽设置得太低了。您的数据中值的范围是多少?

我建议让程序为您计算“理想”带宽,然后在您认为它太大时进行调整。理想值存储在 GPVAL_KDENSITY_BANDWIDTH 中。增加带宽会使包络更平滑;减少它会强调局部尖峰。

【讨论】:

  • 您好,感谢您的回答;几个小时前我遇到了这个例子,但我无法适应我的情况;所以在你回答之后,我又试了一次,但没有成功;我想我应该从演示中的“正常”密度图开始,但我还是失败了;我将更新我的问题以反映我对此做了什么。我会很感激任何提示!