График с бункерами 2D гистограмм
Я видел в постах нормализации бинов гистограммы в Gnuplot, в которых можно скомпоновать несколько х образцов и построить гистограмму с помощью
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)-точки) и построить тип тепловой карты этих данных, например, с тепловой картой, указывающей вероятность или интенсивность (т.е. (количество образцов)/(площадь бункера)).
Как я могу вычислить 2d-bin_plot с Gnuplot
?
Большое спасибо за Вашу помощь
1 ответ
Бинирование 2D-данных основано на том же принципе, что и для 1D. Особенность в том, что опцияsmooth freq
который используется для одномерного бинирования, будет принимать только одно значение для бинов (а не два: x и y). Следовательно, вы просто перечисляете свои корзины из0
кBinCountX * BinCountY - 1
и определить функцииBinValueX(), BinValueY()
чтобы вернуться от номера вашей корзины к значениям x- и y-bin.
Раздел тестовых данных создает случайные значения x,y и z. Z-значения в пределах ax,y-bin будут добавлены в процессе биннинга.
В качестве альтернативы, в зависимости от данных, также может представлять интерес график плотности .
Скрипт: (работает с 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)
BinNoX(x) = floor((x-Xmin)/BinWidthX)
BinNoY(y) = floor((y-Ymin)/BinWidthY)
BinNo(x,y) = BinNoY(y)*BinCountX + BinNoX(x)
BinValueX(n) = Xmin + (int(n)%BinCountX)*BinWidthX
BinValueY(n) = Ymin + (int(n)/BinCountY)*BinWidthY # integer division!
# get data into bins
set table $Bins
plot [*:*][*:*] $Data u (BinNo($1,$2)):3 smooth freq
unset table
set size ratio -1
set xrange [Xmin:Xmax]
set yrange [Ymin:Ymax]
set key noautotitle
set view 60,30,1.2
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 (BinValueX($1)+BinWidthX/2.):(BinValueY($1)+BinWidthY/2.):\
(BinWidthX/2.):(BinWidthX/2.):2 w boxxy fc palette z
unset multiplot
### end of script
Результат: