问题
My data file is a set of (x,y,z) points located around the axis origin. They represent points where a kind of measure has failed. These points are in this link.
Gnuplot can plot them,
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}"
with the resulting plot
The problem is that the figure does not show where the error is more likely to occur. I would like to show the variations in the density of points if it is possible.
I do not know if it is possible to vary the color of the points or give them transparency and try to represent the locations with the most density of points.
If a representation of the density of 3D points is not possible, another way could be to make a projection density of the points in the three planes (x=0,y,z), (x,y=0,z), (x,y,z=0).
Regards
EDIT:
I can plot with different colors the success (0
) and error (1
) point locations of my experiment. The file in this link has a 4th column with all data samples ( 0's and 1's).
The splot
figure
splot "data_all.dat" u 1:2:3:4 w points ls 1 palette title "P_{error}"
is
but this figure is not showing the density of points. For example, in Mathematica the density plot of these data samples is
How could I get the density plot with Gnuplot
?. It is likely that Mathematica is doing an interpolation of the points in the middle and give them values between 0 and 1, but I do not know how to achieve it with Gnuplot.
回答1:
@user1993416, I guess you can do something with gnuplot. You might need to play with the parameter Delta
. With my 8 year old computer 1000 points need approx. 2 minutes.
The followig code:
### 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
should result in:
来源:https://stackoverflow.com/questions/53659762/how-to-plot-x-y-z-points-showing-their-density