3d 如何根据点的类别绘制三维密度图
我正在尝试绘制数据点的XYZ图。每个数据都有一个与“1”错误或“0”成功相关联的值。我的数据在这里。 作为第一次尝试,我使用了3d 如何根据点的类别绘制三维密度图,3d,gnuplot,density-plot,3d,Gnuplot,Density Plot,我正在尝试绘制数据点的XYZ图。每个数据都有一个与“1”错误或“0”成功相关联的值。我的数据在这里。 作为第一次尝试,我使用了splot splot "data_all.dat" u 1:2:3:4 w points ls 1 palette title "P_{error}" 该图的问题在于无法很好地区分点之间的相对位置及其在空间中的位置。为了解决这个问题,一个先例问题提供了一个基于点密度降低颜色的解决方案 我想扩展这个问题,将每个点的类别(错误或成功)包含在标准中,以给它们着色。也就是说
splot
splot "data_all.dat" u 1:2:3:4 w points ls 1 palette title "P_{error}"
该图的问题在于无法很好地区分点之间的相对位置及其在空间中的位置。为了解决这个问题,一个先例问题提供了一个基于点密度降低颜色的解决方案
我想扩展这个问题,将每个点的类别(错误或成功)包含在标准中,以给它们着色。也就是说,考虑这两种类型的点进行着色,并绘制所有类的点
我没有精确的着色方法,但我的想法可能是使用一个函数,如(1-a)x(num_success_in_delta)+(a x num_errors_in_delta)
,其中a
是一个实数[0,1],它加权球中的错误和成功点数delta
。错误和成功样本之间的XYZ点插值可能是另一种方式,但我不知道如何在Gnuplot中解决这个问题
为了改善点密度的信息,如果可能,可以在XY平面上投影等值线或二维密度图。
我希望制作一个eps
文件,将其作为一个图形包含在LaTeX中,并具有提供Gnuplot或pgfplots的质量
关于下面的代码是对此处解决方案的轻微修改()。错误和成功的发生在特定卷中计数
(2*DeltaX x 2*DeltaY x 2*DeltaZ)
。
结果存储在一个文件中,因此,您只需进行一次计数(您的10000行数据在我的旧电脑上花费了大约1H15分钟)。也许,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
例如,您的数据:
补充:
列$5
和$6
当前分别包含特定卷中出现错误和成功的绝对次数。如果您想要一个错误概率(但我不是统计学家),但我的猜测是您必须将错误发生的次数<代码>$5除以本卷中事件总数<代码>$5+$6
splot文件u 1:2:3:($5/($5+$6))w p ps 0.2 pt 7 lc调色板z notitle
另一个示例的调色板是
设置调色板rgb 33,13,10
一般来说,关于调色板,请参考
帮助调色板
,您会发现很多细节。非常感谢。结果就是我想要策划的。我想问你们,是否有一种方法可以评价红色和绿色的强度。例如,使用另一种点类型,以及另一种没有白色的调色板,因为这些点将不可见。请问如何更改指定给这些点的范围。现在,这些点被设置在-1(红色错误)到1(绿色成功)之间,但它们代表一种概率,因此最好将它们设置在0到1之间。@theozhConcerning调色板注释,可以使用您提供的第一个解决方案的调色板。请参阅答案的补充。我不明白为什么需要第一个脚本的最后两行,set palete..
和splot..
。它们在第二个脚本中重复以绘制图形。
### 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