我是 gnuplot 新手。我对使用 gnuplot 支持的高斯函数(使用“平滑 k密度”)进行内核密度重采样也很陌生。我使用了下面提供的 gnuplot 演示脚本。我试图理解第二列 $k密度1 的含义是什么。如果我打印 $k密度1 我会得到这些值:
(...)
140.76 13.1663 13.1663
146.032 12.5092 12.5092 我
151.304 11.6501 11.6501
156.575 10.6298 10.6298
161.847 9.5347 9.5347
167.119 8.48325 8.48325
172.391 7.56657 7.56657
177.662 6.80631 6.80631
(...)
第一列似乎是根据随机表达式提供的 $viol1 第二列定义的样本值计算出的高斯核。但我试图理解 $k密度1 的第二列是如何计算的,因为它定义了“密度”或小提琴图的分布。似乎假设 $2/20.0 计算中的 20.0 常数。但考虑到另一个具有不同范围的样本集,这个值肯定是不同的。因此,$k密度1的第2列是如何计算的(或者它的关系是什么)以及如何找到用于计算扩散的常数(20)?
nsamp = 3000
set print $viol1
do for [i=1:nsamp] {
y = (i%4 == 0) ? 300. + 70.*invnorm(rand(0)) \
: (i%4 == 1) ? 400. + 10.*invnorm(rand(0)) \
: 120. + 40.*invnorm(rand(0))
print sprintf(" 35.0 %8.5g", y)
}
unset print
set title "kdensity mirrored sideways to give a violin plot"
set table $kdensity1
plot $viol1 using 2:(1) smooth kdensity bandwidth 10. with filledcurves above y lt 9 title 'B'
unset table
set border 2
unset margins
unset xtics
set ytics nomirror rangelimited
set xrange [-1:5]
plot $kdensity1 using (3 + $2/20.):1 with filledcurve x=3 lt 9 notitle, '' using (3 - $2/20.):1 with filledcurve x=3 lt 9 notitle
您指的是这个小提琴情节演示。查看 Wikipedia Kernel_(statistics) 和 gnuplot
help kdensity
:
“平滑 k 密度”选项使用高斯核生成并绘制核密度估计值,以获取一组值的分布。值取自第一个数据列,可选权重取自第二列。在每个点的位置放置一个高斯函数,并将所有这些高斯函数的总和绘制为函数。为了获得归一化直方图,每个权重应为 1/点数。 ...
并查看进一步最小化的示例。
输入数据
$Data
smooth kdensity
(1)
部分是该数据点的权重,这里是 1
的常量值(因为有括号)。正如 help kdensity
所建议的,您可以使用 (1/N)
代替,其中 N
是获得归一化小提琴图的点数。我不明白为什么原始示例使用 with filledcurves above y lt 9 title 'B'
$kdensity
第二列中的曲线形状。
关于$2/20.
,我猜,示例中的这个因素
20.
只是两个小提琴图在图中不会碰撞的缩放因子。为了自动找出合理的缩放因子,您可以执行 stats
来获取数据块第二列的最大值
$kdensity
。
如果您想比较几个小提琴图,您应该将所有最大值中的最大值作为比例因子。绘图命令中的 3 +
和
3 -
只是镜像小提琴图的 x 偏移。脚本:
### violin plot
reset session
$Data <<EOD
1.0
2.0
4.0
1.0
2.0
2.0
EOD
N = |$Data|
set table $kdensity
plot $Data u 1:(1) smooth kdensity bandwidth 0.2
unset table
stats [*:*][*:*] $kdensity u 2
print STATS_max, STATS_min
set key noautotitle
set xrange[1:5]
set yrange[0:5]
plot $kdensity u (3 + $2/STATS_max):1 w filledcurve x=3 lt 9, \
'' u (3 - $2/STATS_max):1 w filledcurve x=3 lt 9
### end of script