Как построить (x, y, z) точки, показывающие их плотность - PullRequest
0 голосов
/ 07 декабря 2018

Мой файл данных представляет собой набор (x, y, z) точек, расположенных вокруг начала координат.Они представляют точки, где некая мера провалилась.Эти точки находятся в этой ссылке .

Gnuplot может построить их,

set encoding iso_8859_1
set term postscript eps enhanced color size 4.7in,4in
set xlabel "X"
set ylabel "Y"
set zlabel "Z"
set output "test_gp.eps"
set style line 1 lc rgb '#0060ad' pt 7 ps 0.5 lt 1 lw 0.5 # --- blue
set style fill  transparent solid 0.15 noborder
splot "data.dat" u 1:2:3 w p ls 1 title "P_{error}"

с результирующим графиком

enter image description here

Проблема заключается в том, что на рисунке не показано, где вероятность возникновения ошибки выше.Я хотел бы показать различия в плотности точек, если это возможно.

Я не знаю, возможно ли изменить цвет точек или придать им прозрачность и попытаться представить местоположения с помощьюнаибольшая плотность точек.

Если представление плотности трехмерных точек невозможно, другим способом может быть создание плотности проекции точек в трех плоскостях (x = 0, y, z),(x, y = 0, z), (x, y, z = 0).

С уважением

РЕДАКТИРОВАТЬ:

Я могу наносить разными цветами местоположения точек успеха (0) и ошибок (1)мой эксперимент.Файл в этой ссылке содержит 4-й столбец со всеми выборками данных (0 и 1).

splot число

splot "data_all.dat" u 1:2:3:4 w points ls 1 palette title "P_{error}"

равно

enter image description here

, но на этом рисунке не показана плотностьочков.Например, в Mathematica график плотности этих выборок данных составляет

enter image description here

Как я могу получить график плотности с Gnuplot ?.Вполне вероятно, что Mathematica выполняет интерполяцию точек в середине и задает им значения от 0 до 1, но я не знаю, как этого добиться с помощью Gnuplot.

1 Ответ

0 голосов
/ 12 декабря 2018

@ user1993416, я думаю, вы можете что-то сделать с gnuplot.Возможно, вам придется поиграть с параметром Delta.С моим 8-летним компьютером 1000 баллов нужно ок.2 минуты.

Следующий код:

### 3D density plot
reset session
set term wxt

N = 1000      # number of datapoints
Delta = 2    # half boxwidth

TimeStart = time(0.0)
# create dummy some dummy data
set samples N
set table $Data
    plot '+' u (invnorm(rand(0))):(invnorm(rand(0))):(invnorm(rand(0))) with table
unset table

# put the datafile/dataset into arrays
stats $Data nooutput
RowCount = STATS_records
array ColX[RowCount]
array ColY[RowCount]
array ColZ[RowCount]
array ColC[RowCount]
do for [i=1:RowCount] {
set table $Dummy
    plot $Data u (ColX[$0+1]=$1,0):(ColY[$0+1]=$2,0):(ColZ[$0+1]=$3,0) with table
unset table
}

# look at each datapoint and its sourrounding
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 $Occurrences
        plot $Data u ((abs(x0-$1)<Delta) & (abs(y0-$2)<Delta) & (abs(z0-$3)<Delta) ? 1 : 0):(1) smooth frequency
    unset table
    # extract the number from $Occurrences which will be used to color the datapoint
    set table $Dummmy
        plot $Occurrences u (c0=$2,0):($0) every ::1::1 with table
    unset table
    ColC[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",ColX[i],ColY[i],ColZ[i],ColC[i])
}
set print

TimeEnd = time(0.0)
print sprintf("Duration: %.3f sec",TimeEnd-TimeStart)

set palette rgb 33,13,10
splot $Data u 1:2:3:4 w p ps 1 pt 7 lc palette z notitle

set terminal gif animate delay 30
set output "Density.gif"
Amin = 40
Amax = 60
AFrames = 25
do for [i=0:AFrames] {
    print sprintf("Frame %g, Angle: %.1f", i, sin(2*pi*i/AFrames)*(Amax-Amin)+Amin)
    set view 45,(sin(2*pi*i/AFrames)*(Amax-Amin)+Amin)
    replot
}
set output

должен привести к:

enter image description here

...