使用 2D 直方图箱进行绘图

问题描述 投票:0回答:1

我在帖子中看到在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?

非常感谢您的帮助

gnuplot histogram2d
1个回答
1
投票

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

结果:

© www.soinside.com 2019 - 2024. All rights reserved.