Как сделать трехмерный график плотности на основе класса точки - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь составить XYZ-график моих точек данных.Каждые данные имеют значение, связанное с ошибкой «1» или «0» успеха.Мои данные в этой ссылке .В качестве первой попытки я использовал splot

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

enter image description here

Проблема с этим графиком состоит в том, что невозможно хорошо различитьвзаимное расположение точек и их расположение в пространстве.Чтобы решить эту проблему, возникает вопрос Как построить точки (x, y, z), показывающие их плотность , дает решение, которое ухудшает цвет на основе плотности точек.

Я хотел бы расширить этот вопрос, включив класс каждой точки (ошибка или успех) в критерии их раскрашивания.То есть учтите оба типа точек, чтобы сделать раскраску, и нанесите все классы точек.

У меня нет точного способа сделать раскраску, но идея может заключаться в использовании функции, подобной (1 - a) x (num_success_in_delta) + (a x num_errors_in_delta), где a - действительное число [0,1], которое взвешивает число ошибок и успехаочки в шаре delta.Интерполяция точек XYZ между выборками ошибок и успешных результатов могла бы быть иным способом, но я не знаю, как к этому можно обратиться в Gnuplot.

Для улучшения информации о плотности точек, если возможно, проекция изолиний илиГрафик 2D плотности в плоскости XY может быть уточняющим.Я хочу сделать файл eps для включения в качестве фигуры в LaTeX с качеством, которое обеспечивает Gnuplot или pgfplots.

С уважением

1 Ответ

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

Приведенный ниже код представляет собой небольшую модификацию решения ( Как построить (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

Дополнение: Столбцы $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, и вы найдете много деталей.

...