commit c2a3e6ad754c2038babb31aa4e5f6eaf611e8fe9
parent 9b416ed1733da8ca3fa83cfc2b094961982a4414
Author: Ivan Gankevich <i.gankevich@spbu.ru>
Date: Thu, 8 Apr 2021 19:07:16 +0300
Recalculate everything for the new RMSE.
Diffstat:
9 files changed, 115 insertions(+), 73 deletions(-)
diff --git a/Makefile b/Makefile
@@ -58,15 +58,13 @@ build/daily-stats.svg: gnuplot/daily-stats.gnuplot build/daily-stats
build/daily-rmse.svg: gnuplot/daily-rmse.gnuplot build/daily-rmse
gnuplot -d $<
-build/gnuplot/velocity-xy-dist-min.svg: gnuplot/velocity-xy-dist.gnuplot build/direction/1616497200-hist-xy
- gnuplot -d -c gnuplot/velocity-xy-dist.gnuplot \
- build/direction/1616497200-hist-xy build/gnuplot/velocity-xy-dist-min.svg \
- 0.024544 4.495469
-
-build/gnuplot/velocity-xy-dist-max.svg: gnuplot/velocity-xy-dist.gnuplot build/direction/1616792400-hist-xy
- gnuplot -d -c gnuplot/velocity-xy-dist.gnuplot \
- build/direction/1616792400-hist-xy build/gnuplot/velocity-xy-dist-max.svg \
- 0.154791 0.801432
+build/gnuplot/velocity-xy-dist-min.svg: gnuplot/velocity-xy-dist.gnuplot build/gnuplot/direction_rmse.gnuplot
+ gnuplot -d -c gnuplot/velocity-xy-dist.gnuplot min
+
+build/gnuplot/velocity-xy-dist-max.svg: gnuplot/velocity-xy-dist.gnuplot build/gnuplot/direction_rmse.gnuplot
+ gnuplot -d -c gnuplot/velocity-xy-dist.gnuplot max
+
+build/gnuplot/direction-dist.svg: build/gnuplot/direction_rmse.gnuplot
#build/main.zip: build/gnuplot/*.eps main.tex
build/main.zip: main.tex
diff --git a/R/anal.R b/R/anal.R
@@ -344,7 +344,7 @@ fit_velocity_acf_bilateral <- function (velocity, axis="x", timestamp=0, plot=TR
estimated=estimated)
}
-fit_direction <- function (theta, density, plot=TRUE, sign=-1) {
+fit_direction <- function (theta, density, plot=TRUE) {
pdf_x <- data.frame(x=theta,density=density);
#print(pdf_x)
scale <- max(abs(theta))
@@ -378,19 +378,27 @@ fit_direction_bilateral <- function (direction, plot=TRUE, timestamp=0, dist="vo
x = hist$x;
v = hist$density;
d = density(direction,adjust=0.5)
- dist_left <- fit_direction(x[x<=0], v[x<=0], sign=-1, plot=FALSE)
- dist_right <- fit_direction(x[x>=0], v[x>=0], sign=1, plot=FALSE)
- #dist_left <- fit_direction(x[x>=0], v[x>=0], sign=1, plot=FALSE)
- #x <- c(dist_left$x, dist_right$x)
- actual_density <- c(dist_left$actual_density, dist_right$actual_density)
- estimated_density <- c(dist_left$estimated_density, dist_right$estimated_density)
+ dist_1 <- fit_direction(x[-pi<=x&x<=-pi/2], v[-pi<=x&x<=-pi/2], plot=FALSE)
+ dist_2 <- fit_direction(x[-pi/2<=x&x<=0], v[-pi/2<=x&x<=0], plot=FALSE)
+ dist_3 <- fit_direction(x[x>=0&x<=pi/2], v[x>=0&x<=pi/2], plot=FALSE)
+ dist_4 <- fit_direction(x[x>=pi/2&x<=pi], v[x>=pi/2&x<=pi], plot=FALSE)
+ #dist_1 <- fit_direction(x[x>=0], v[x>=0], sign=1, plot=FALSE)
+ #x <- c(dist_1$x, dist_3$x)
+ actual_density <- c(dist_1$actual_density,
+ dist_2$actual_density,
+ dist_3$actual_density,
+ dist_4$actual_density)
+ estimated_density <- c(dist_1$estimated_density,
+ dist_2$estimated_density,
+ dist_3$estimated_density,
+ dist_4$estimated_density)
if (plot) {
plot(x, actual_density, xlab='Direction', ylab='PDF')
#hist(direction, xlab=paste('Velocity', axis), ylab='PDF', freq=FALSE, breaks=100)
lines(d, col='green', lwd=2)
#lines(x, estimated_density, col='red', lwd=2)
- lines(dist_left$x, dist_left$estimated_density, col='red', lwd=2)
- lines(dist_right$x, dist_right$estimated_density, col='blue', lwd=2)
+ lines(dist_1$x, dist_1$estimated_density, col='red', lwd=2)
+ lines(dist_3$x, dist_3$estimated_density, col='blue', lwd=2)
}
#printf("RMSE %f\n", rmse(estimated_density, actual_density))
path <- file.path('build', 'direction', dist)
@@ -401,7 +409,7 @@ fit_direction_bilateral <- function (direction, plot=TRUE, timestamp=0, dist="vo
write("\n",file=filename,append=TRUE)
write.table(data.frame(x=d$x,density=d$y), filename,
row.names=FALSE, quote=FALSE, append=TRUE)
- list(coefficients=dist_left$coefficients,
+ list(coefficients=dist_1$coefficients,
rmse=rmse(estimated_density, actual_density))
}
diff --git a/R/direction-min-max.R b/R/direction-min-max.R
@@ -1,9 +1,10 @@
library(gplots) # hist2d
source("R/common.R")
+source("build/gnuplot/direction_rmse.gnuplot")
-t_min_rmse <- 1616497200
-t_max_rmse <- 1616792400
+t_min_rmse <- direction_rmse_min_timestamp
+t_max_rmse <- direction_rmse_max_timestamp
time_delta = 60*60*2
for (timestamp in c(t_min_rmse, t_max_rmse)) {
velocity <- select_samples(timestamp, timestamp+time_delta)
diff --git a/R/minmax.R b/R/minmax.R
@@ -2,6 +2,22 @@ library(DBI)
source("R/common.R")
+gnuplot <- function (file, str, ...) {
+ cat(sprintf(str, ...), file=file, append=TRUE)
+}
+gnuplot_all <- function (filename, prefix, rmse_column, row_min, row_max) {
+ f <- filename
+ cat("",file=f)
+ gnuplot(f, paste(prefix,"_rmse_min = %f\n",sep=""), row_min[rmse_column])
+ gnuplot(f, paste(prefix,"_rmse_min_timestamp = %d\n",sep=""), as.integer(row_min["timestamp"]))
+ gnuplot(f, paste(prefix,"_rmse_min_speed = %f\n",sep=""), row_min["speed"])
+ gnuplot(f, paste(prefix,"_rmse_min_direction = %f\n",sep=""), row_min["direction"])
+ gnuplot(f, paste(prefix,"_rmse_max = %f\n",sep=""), row_max[rmse_column])
+ gnuplot(f, paste(prefix,"_rmse_max_timestamp = %d\n",sep=""), as.integer(row_max["timestamp"]))
+ gnuplot(f, paste(prefix,"_rmse_max_speed = %f\n",sep=""), row_max["speed"])
+ gnuplot(f, paste(prefix,"_rmse_max_direction = %f\n",sep=""), row_max["direction"])
+}
+
data <- read.table("build/daily-rmse", sep="", header=TRUE)
z_rmse_sorted <- sort(data$z_rmse, decreasing=TRUE)
print("Min. velocity RMSE")
@@ -15,7 +31,6 @@ print(data[data$z_rmse == z_rmse_sorted[[1]], ])
print(data[data$z_rmse == z_rmse_sorted[[2]], ])
print("Mean velocity RMSE")
print(summary(data))
-print(cor(data))
with(list(tmp = data[data$x_rmse == min(data$x_rmse), ]),
printf("Velocity X min. RMSE = %f (%s), mean speed = %f\n", tmp["x_rmse"], tmp["timestamp"], tmp["speed"]))
with(list(tmp = data[data$y_rmse == min(data$y_rmse), ]),
@@ -29,6 +44,15 @@ with(list(tmp = data[data$y_rmse == max(data$y_rmse), ]),
with(list(tmp = data[data$z_rmse == max(data$z_rmse), ]),
printf("Velocity Z max. RMSE = %f (%s), mean speed = %f\n", tmp["z_rmse"], tmp["timestamp"], tmp["speed"]))
#print(data)
+gnuplot_all("build/gnuplot/x_rmse.gnuplot", "x", "x_rmse",
+ data[data$x_rmse == min(data$x_rmse),],
+ data[data$x_rmse == max(data$x_rmse),])
+gnuplot_all("build/gnuplot/y_rmse.gnuplot", "y", "y_rmse",
+ data[data$y_rmse == min(data$y_rmse),],
+ data[data$y_rmse == max(data$y_rmse),])
+gnuplot_all("build/gnuplot/z_rmse.gnuplot", "z", "z_rmse",
+ data[data$z_rmse == min(data$z_rmse),],
+ data[data$z_rmse == max(data$z_rmse),])
direction_rmse_min = data[data$direction_rmse == min(data$direction_rmse), ]
direction_rmse_max = data[data$direction_rmse == max(data$direction_rmse), ]
@@ -44,6 +68,8 @@ printf("Max. direction RMSE = %f (%s), mean direction = %f, mean speed = %f\n",
direction_rmse_max["direction"],
direction_rmse_max["speed"])
printf("Mean direction RMSE = %f\n", direction_rmse_mean)
+gnuplot_all("build/gnuplot/direction_rmse.gnuplot",
+ "direction", "direction_rmse", direction_rmse_min, direction_rmse_max)
filename <- "build/gnuplot/acf_rmse.gnuplot"
cat("",file=filename)
@@ -94,3 +120,5 @@ with(list(tmp = data[data$acf_z_rmse == max(data$acf_z_rmse), ]),
gnuplot("acf_z_rmse_max_speed = %f\n", tmp["speed"])
printf("ACF Z max. RMSE = %f (%s), mean speed = %f\n", tmp["acf_z_rmse"], tmp["timestamp"], tmp["speed"])
})
+
+print(cor(data)["speed",])
diff --git a/gnuplot/acf.gnuplot b/gnuplot/acf.gnuplot
@@ -51,7 +51,7 @@ filename('y',acf_y_rmse_max_timestamp) index 0 using (-$1):2 with points pt 6 lc
'' index 1 using ($1):2 with points pt 6 lc '#404040',\
'' index 1 using ($1):3 with lines lw 2 lc '#c04040'
-set yrange [0:0.1]
+set yrange [0:2]
set title sprintf('RMSE_z = %.1f%%', (acf_z_rmse_max*100))
plot \
filename('z',acf_z_rmse_max_timestamp) index 0 using (-$1):2 with points pt 6 lc '#404040',\
@@ -72,7 +72,7 @@ filename('x',acf_x_rmse_min_timestamp) index 0 using (-$1):2 with points pt 6 lc
'' index 1 using ($1):2 with points pt 6 lc '#404040',\
'' index 1 using ($1):3 with lines lw 2 lc '#c04040'
-set yrange [0:2]
+set yrange [0:0.25]
set title sprintf('RMSE_y = %.1f%%',(acf_y_rmse_min*100))
plot \
filename('y',acf_y_rmse_min_timestamp) index 0 using (-$1):2 with points pt 6 lc '#404040',\
diff --git a/gnuplot/direction-dist.gnuplot b/gnuplot/direction-dist.gnuplot
@@ -1,3 +1,4 @@
+load "build/gnuplot/direction_rmse.gnuplot"
set terminal svg size 450,450/2 font 'Free Serif, 10' enhanced round dynamic
set xtics nomirror out offset 0,0.25
set ytics nomirror out offset 0.5,0
@@ -7,7 +8,7 @@ set output 'build/gnuplot/direction-dist.svg'
set xlabel 'θ' offset 0,1.0
set xrange [-180:180]
set xtics -180,90
-set yrange [0:4]
+set yrange [0:2]
set rmargin 1.5
set tmargin 1
set title offset 0,-1
@@ -16,21 +17,21 @@ positive(x) = x<0 ? (1/0) : x
negative(x) = x>0 ? (1/0) : x
round(x) = floor(x+0.5)
rad2deg(rad) = (rad * 180) / pi
-# Min. direction RMSE = 0.024544 (1616497200), mean direction = -2.399689, mean speed = 4.495469
-# Max. direction RMSE = 0.154791 (1616792400), mean direction = -2.440686, mean speed = 0.801432
-# Mean direction RMSE = 0.056350
-
+filename = sprintf('build/direction/vonmises/%d', direction_rmse_max_timestamp)
set lmargin 5
-set title sprintf('RMSE = %.0f%%, mean speed = %.1fm/s',round(0.154791*100), 0.801432)
+set title sprintf('RMSE = %.0f%%, mean speed = %.1fm/s', \
+ round(direction_rmse_max*100), direction_rmse_max_speed)
plot \
-'build/direction/vonmises/1616792400' index 0 using (rad2deg($1)):2 every 5 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
+filename index 0 using (rad2deg($1)):2 every 5 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
'' index 0 using (positive(rad2deg($1))):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_x',\
'' index 0 using (negative(rad2deg($1))):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_x'
+filename = sprintf('build/direction/vonmises/%d', direction_rmse_min_timestamp)
set lmargin 5
-set title sprintf('RMSE = %.0f%%, mean speed = %.1fm/s',round(0.024544*100), 4.495469)
+set title sprintf('RMSE = %.0f%%, mean speed = %.1fm/s', \
+ round(direction_rmse_min*100), direction_rmse_min_speed)
plot \
-'build/direction/vonmises/1616497200' index 0 using (rad2deg($1)):2 every 5 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
+filename index 0 using (rad2deg($1)):2 every 5 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
'' index 0 using (positive(rad2deg($1))):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_x',\
'' index 0 using (negative(rad2deg($1))):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_x'
diff --git a/gnuplot/velocity-dist.gnuplot b/gnuplot/velocity-dist.gnuplot
@@ -1,4 +1,7 @@
load 'gnuplot/paired.pal'
+load 'build/gnuplot/x_rmse.gnuplot'
+load 'build/gnuplot/y_rmse.gnuplot'
+load 'build/gnuplot/z_rmse.gnuplot'
set terminal svg size 450,450/3*2 font 'Free Serif, 10' enhanced round dynamic
set xtics nomirror out offset 0,0.25
set ytics nomirror out offset 0.5,0
@@ -9,7 +12,8 @@ unset key
set output 'build/gnuplot/velocity-dist.svg'
set xlabel 'υ_x' offset 0,1.0
-set yrange [0:1.2]
+set yrange [0:0.4]
+set ytics 0,0.1
set rmargin 0
set tmargin 1
set multiplot layout 2,3
@@ -18,43 +22,39 @@ positive(x) = x<0 ? (1/0) : x
negative(x) = x>0 ? (1/0) : x
round(x) = floor(x+0.5)
-# Velocity X max. RMSE = 0.123038 (1615230000), mean speed = 2.497133
-# Velocity Y max. RMSE = 0.115007 (1615388400), mean speed = 1.435405
-# Velocity Z max. RMSE = 0.141865 (1616958000), mean speed = 0.853936
-
###################################
# first row
###################################
+filename = sprintf('build/velocity/x/weibull/%d', x_rmse_max_timestamp)
set lmargin 5
set title offset 0,-1
-set title sprintf('RMSE_x = %.0f%%', round(0.123038*100))
-set xrange [-5:3]
+set title sprintf('RMSE_x = %.1f%%', (x_rmse_max*100))
+set xrange [-10:10]
plot \
-'build/velocity/x/weibull/1615230000' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_x',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_x'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
-#set key top center outside Left reverse
+filename = sprintf('build/velocity/y/weibull/%d', y_rmse_max_timestamp)
set lmargin 5
-#set xrange [-3:3]
set xlabel 'υ_y'
-set title sprintf('RMSE_y = %.0f%%',round(0.115007*100))
-set xrange [-4:4]
+set title sprintf('RMSE_y = %.1f%%',(y_rmse_max*100))
+#set xrange [-4:4]
plot \
-'build/velocity/y/weibull/1615388400' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_y',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_y',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_y',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_y'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
#unset key
-set xrange [-4:4]
-#set xtics -2,1,2
+filename = sprintf('build/velocity/z/weibull/%d', z_rmse_max_timestamp)
+#set xrange [-4:4]
set xlabel 'υ_z'
-set title sprintf('RMSE_z = %.0f%%', round(0.141865*100))
+set title sprintf('RMSE_z = %.1f%%', (z_rmse_max*100))
plot \
-'build/velocity/z/weibull/1616958000' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_z',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_z',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_z',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_z'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
@@ -67,35 +67,37 @@ plot \
# second row
###################################
set bmargin 3
-set xrange [-4:4]
+set xrange [-4.5:4.5]
set yrange [0:1.2]
set ytics 0,0.2
#set xtics -10,1
+filename = sprintf('build/velocity/x/weibull/%d', x_rmse_min_timestamp)
set lmargin 5
-set title sprintf('RMSE_x = %.0f%%', round(0.016698*100))
+set title sprintf('RMSE_x = %.1f%%', (x_rmse_min*100))
plot \
-'build/velocity/x/weibull/1614135600' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_x',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_x',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_x'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
+filename = sprintf('build/velocity/y/weibull/%d', y_rmse_min_timestamp)
set lmargin 5
#set xrange [-3:3]
set xlabel 'υ_y'
-set title sprintf('RMSE_y = %.0f%%', round(0.021981*100))
+set title sprintf('RMSE_y = %.1f%%', (y_rmse_min*100))
#set xrange [-3:5]
plot \
-'build/velocity/y/weibull/1615647600' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_y',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_y',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_y',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_y'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
-#set xtics -2,1,2
+filename = sprintf('build/velocity/z/weibull/%d', z_rmse_min_timestamp)
set xlabel 'υ_z'
-set title sprintf('RMSE_z = %.0f%%', round(0.015136*100))
+set title sprintf('RMSE_z = %.1f%%', (z_rmse_min*100))
plot \
-'build/velocity/z/weibull/1615647600' index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_z',\
+filename index 0 using 1:2 with points pt 6 lc '#404040' title 'Observed PDF of υ_z',\
'' index 0 using (positive($1)):3 with lines lw 2 lc '#c04040' title 'Estimated PDF of positive υ_z',\
'' index 0 using (negative($1)):3 with lines lw 2 lc '#4040c0' title 'Estimated PDF of negative υ_z'
#'' index 1 using 1:2 with lines dashtype 1 lw 2 lc '#808080' notitle, \
diff --git a/gnuplot/velocity-xy-dist.gnuplot b/gnuplot/velocity-xy-dist.gnuplot
@@ -1,4 +1,5 @@
load 'gnuplot/blues.pal'
+load 'build/gnuplot/direction_rmse.gnuplot'
set palette defined (0 '#4040c0', 1 '#c0c0c0', 2 '#c04040')
#set palette defined (0 '#c0c0c0', 1 '#c04040')
f = 0.90
@@ -37,16 +38,23 @@ circle(x,y,z) = length(x,y)>s ? NaN : z
#circle(x,y,z) = z
max(x,y) = x>y ? x : y
-filename = ARG1
+direction_rmse = direction_rmse_min
+direction_rmse_timestamp = direction_rmse_min_timestamp
+direction_rmse_speed = direction_rmse_min_speed
+direction_rmse_direction = direction_rmse_min_direction
+if (ARG1 eq 'max') {
+ direction_rmse = direction_rmse_max;
+ direction_rmse_timestamp = direction_rmse_max_timestamp;
+ direction_rmse_speed = direction_rmse_max_speed;
+ direction_rmse_direction = direction_rmse_max_direction;
+}
+filename = sprintf('build/direction/%d-hist-xy', direction_rmse_timestamp)
filename_tmp = sprintf('%s.tmp', filename)
filename_cnt = sprintf('%s.cnt', filename)
-filename_out = ARG2
-rmse = ARG3 + 0
-speed = ARG4 + 0
-
-# Min. direction RMSE = 0.024544 (1616497200), mean direction = -2.399689
-# Max. direction RMSE = 0.154791 (1616792400), mean direction = -2.440686
-# Mean direction RMSE = 0.056350
+filename_out = sprintf('build/gnuplot/velocity-xy-dist-%s.svg', ARG1)
+rmse = direction_rmse
+speed = direction_rmse_speed
+print filename
## interpolation {{{
## http://www.gnuplotting.org/circular-heat-map/
diff --git a/main.tex b/main.tex
@@ -356,13 +356,9 @@ distributions for each axis are presented in figure~\ref{fig-velocity-distributi
Wind direction was approximated by von Mises distribution using least-squares
fitting. Following the common
practice~\cite{feng2015sectors} we divided direction axis
-into sectors: ``positive'' (from 0 to 180\textdegree) and ``negative'' (from 0 to
--180\textdegree) --- and fitted each sector independently. We choose two
-sectors as they give reasonably small error: one sector is not enough here,
-because we always have at least two mean directions (one for incident flow and
-one for turbulent flow behined the arm), and four sectors or more is too many
-as we have four mean directions only when the wind speed is low and the flow
-is close to turbulent. The best-fit and worst-fit distributions for each axis
+into four sectors: from -180\textdegree to -90\textdegree, from from -90\textdegree to
+0\textdegree, from 0 to 90\textdegree and from 90\textdegree to 180\textdegree --- and fitted each sector independently. We chose four sector to have one sector for each side of the anemometer.
+The best-fit and worst-fit distributions for each axis
are presented in figure~\ref{fig-direction-distributions}.
\begin{figure}