График с бункерами 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

Результат:

Другие вопросы по тегам