Приведенный ниже код представляет собой небольшую модификацию решения ( Как построить (x, y, z) точки, показывающие их плотность ).Случаи ошибок и успеха подсчитываются в определенном объеме (2*DeltaX x 2*DeltaY x 2*DeltaZ)
.Результаты сохраняются в файле, поэтому вам нужно выполнить подсчет только один раз (ваши 10 000 строк данных заняли около 1 часа 15 минут на моем старом ПК).Возможно, код gnuplot можно сделать более эффективным.Хорошо, тогда вы берете второй код ниже и быстро строите полученный файл.Я не уверен, какой способ окраски лучше.Вы можете играть с цветовой палитрой.В качестве примера приведенный ниже код использует красный (-1) для максимального количества ошибок (т. Е. Плотность) и зеленый (+1) для максимальной плотности успеха.Я надеюсь, что это как-то полезно в качестве отправной точки для дальнейшей оптимизации.
### 3D density plot
reset session
FILE = "data_all.dat"
DeltaX = 0.5 # half boxwidth
DeltaY = 0.5 # half boxlength
DeltaZ = 0.5 # half boxheight
TimeStart = time(0.0)
# put the datafile/dataset into arrays
stats FILE nooutput
RowCount = STATS_records
array ColX[RowCount]
array ColY[RowCount]
array ColZ[RowCount]
array ColR[RowCount] # Result 0=Success, 1=Error
array ColCE[RowCount] # Counts Error
array ColCS[RowCount] # Counts Success
do for [i=1:RowCount] {
set table $Dummy
plot FILE u (ColX[$0+1]=$1,0):(ColY[$0+1]=$2,0):(ColZ[$0+1]=$3,0):(ColR[$0+1]=$4,0) with table
unset table
}
# look at each datapoint and its sourrounding
Error = 1
Success = 0
do for [i=1:RowCount] {
print sprintf("Datapoint %g of %g",i,RowCount)
x0 = ColX[i]
y0 = ColY[i]
z0 = ColZ[i]
# count the datapoints with distances <Delta around the datapoint of interest
set table $ErrorOccurrences
plot FILE u ((abs(x0-$1)<DeltaX) & (abs(y0-$2)<DeltaY) & (abs(z0-$3)<DeltaZ) & ($4==Error)? 1 : 0):(1) smooth frequency
unset table
set table $SuccessOccurrences
plot FILE u ((abs(x0-$1)<DeltaX) & (abs(y0-$2)<DeltaY) & (abs(z0-$3)<DeltaZ) & ($4==Success) ? 1 : 0):(1) smooth frequency
unset table
# extract the number from $Occurrences which will be used to color the datapoint
set table $ErrorDummy
plot $ErrorOccurrences u (c0=$2,0):($0) every ::1::1 with table
unset table
ColCE[i] = c0
set table $SuccessDummy
plot $SuccessOccurrences u (c0=$2,0):($0) every ::1::1 with table
unset table
ColCS[i] = c0
}
# put the arrays into a dataset again
set print $Data
do for [i=1:RowCount] {
print sprintf("%g\t%g\t%g\t%g\t%g\t%g",ColX[i],ColY[i],ColZ[i],ColR[i],ColCE[i],ColCS[i])
}
set print
stats $Data u 5:6 nooutput
CEmax = STATS_max_x
CSmax = STATS_max_y
print CEmax, CSmax
TimeEnd = time(0.0)
print sprintf("Duration: %.3f sec",TimeEnd-TimeStart)
set print "data_all_color.dat"
print $Data
set print
set palette defined (-1 "red", 0 "white", 1 "green")
splot $Data u 1:2:3:($4==1? -$5/CEmax : $6/CSmax) w p ps 0.5 pt 7 lc palette z notitle
### end of code
После того, как вы посчитали вхождения, просто нанесите новый файл данных и поиграйте с цветовой палитрой.
### 3D density plot
reset session
FILE = "data_all_color.dat"
stats FILE u 5:6 nooutput # get maxium count from Error and Success
CEmax = STATS_max_x
CSmax = STATS_max_y
print CEmax, CSmax
set ztics 0.2
set view 50,70
set palette defined (-1 "red", 0 "white", 1 "green")
splot FILE u 1:2:3:($4==1? -$5/CEmax : $6/CSmax) w p ps 0.2 pt 7 lc palette z notitle
### end of code
Дляпример с вашими данными:
![enter image description here](https://i.stack.imgur.com/OgEZv.png)
Дополнение: Столбцы $5
и $6
в настоящее время содержат абсолютное количество случаев ошибок и успехов в определенномобъем соответственно.Если вам нужна вероятность ошибки (но я не статистик), но я предполагаю, что вы должны разделить случаи ошибки $5
на общее количество событий $5+$6
в этом томе.
splot FILE u 1:2:3:($5/($5+$6)) w p ps 0.2 pt 7 lc palette z notitle
Палитра для другого примера была set palette rgb 33,13,10
В общем, для палитры, обратитесь к help palette
, и вы найдете много деталей.