【发布时间】: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