我在帖子中看到在Gnuplot中标准化直方图箱可以对一些x样本进行分箱并绘制直方图,使用
binwidth=5
bin(x,width)=width*floor(x/width) + binwidth/2.0
plot 'file.dat' using (bin($1, binwidth)):(1/(binwidth*num_points) smooth freq with boxes
我想获得与该文章相同的结果,但使用 2D 数据集((x,y)点)并绘制该数据的一种类型的热图,例如用指示概率或强度的热图(即(样本数)/(bin 面积))。
如何使用
Gnuplot
计算 2d-bin_plot?
非常感谢您的帮助
2D 数据的分箱与 1D 数据的分箱原理相同。它的特殊之处在于,用于一维分箱的选项
smooth freq
只接受一个分箱值(而不是两个:x 和 y)。
因此,您只需枚举从 0
到 BinCountX * BinCountY - 1
的 bin,并定义函数 BinValueX(), BinValueY()
即可从 bin 编号返回到 x 和 y-bin 值。
测试数据部分创建随机 x、y 和 z 值。 x,y-bin 内的 z 值将在分箱过程中添加。
或者,根据数据,密度图也可能令人感兴趣。
脚本:(适用于 gnuplot>=5.0.0)
### 2D binning of data
reset session
# create some random test data
set table $Data
set samples 5000
plot '+' u (invnorm(rand(0))):(invnorm(rand(0))):(int(rand(0)*10+1)) w table
set samples 1000
plot '+' u (invnorm(rand(0))+2):(invnorm(rand(0))+2):(int(rand(0)*10+1)) w table
unset table
BinWidthX = 0.25
BinWidthY = 0.25
# get data range min, max
stats $Data u 1:2 nooutput
Xmin = floor(STATS_min_x/BinWidthX)*BinWidthX
Ymin = floor(STATS_min_y/BinWidthY)*BinWidthY
Xmax = ceil(STATS_max_x/BinWidthX)*BinWidthX
Ymax = ceil(STATS_max_y/BinWidthY)*BinWidthY
BinCountX = int((Xmax-Xmin)/BinWidthX)
BinCountY = int((Ymax-Ymin)/BinWidthY)
XYtoBinNo(x,y) = (floor((y-Ymin)/BinWidthY))*BinCountX + floor((x-Xmin)/BinWidthX)
BinNoToX(n) = Xmin + (int(n)%BinCountX)*BinWidthX
BinNoToY(n) = Ymin + (int(n)/BinCountY)*BinWidthY # integer division!
# get data into bins
set table $Bins
plot [*:*][*:*] $Data u (XYtoBinNo($1,$2)):3 smooth freq
unset table
set size ratio -1
set xrange [Xmin:Xmax]
set yrange [Ymin:Ymax]
set key noautotitle
set style fill solid 1.0
set grid x,y
set multiplot layout 1,2
set title "Raw data"
plot $Data u 1:2:3 w p pt 7 ps 0.2 lc palette
set title "2D binned data"
plot $Bins u (BinNoToX($1)+(dx=BinWidthX/2.)):(BinNoToY($1)+(dy=BinWidthY/2.)):\
(dx):(dy):2 w boxxy fc palette z
unset multiplot
### end of script
结果: