Source code for attitude.display.error_comparison

import numpy as N
from matplotlib.pyplot import subplots
from scipy.stats import chi2

from ..orientation import Orientation
from ..error.axes import sampling_axes, noise_axes
from ..geom.util import vector
from .plot.cov_types import hyperbola, bootstrap_noise, augment, ci
from .hyperbola import HyperbolicErrors

[docs]def bootstrap_ci(deskewed_data): # Bootstrap with noise std greater of 1m or the standard deviation of residuals # (in this case about 1m) def func(arr): means = arr.mean(axis=0) arr -= means f = Orientation(arr) al = f.axes[1][1:] xc = xvals - means[1] yc = al[1]/al[0]*xc y = yc + means[2] return y s = deskewed_data[:,2].std() if s < 1: s = 1 yhat_boots = bootstrap_noise(deskewed_data, func, std=s) return ci(yhat_boots,axis=0)
[docs]def error_comparison(fit, do_bootstrap=False, **kwargs): deskewed_data = fit.rotated() fig, ax = subplots() width = kwargs.pop("width", None) if width is None: max = N.abs(deskewed_data[0]).max() width = 2.5*max height = kwargs.pop('height',None) if height is None: height = width/25 aspect_ratio = kwargs.pop("aspect_ratio",None) if aspect_ratio is not None: ax.set_aspect(aspect_ratio) def bounds(dim): v = dim/2 return (-v,v) w = bounds(width) xvals = N.linspace(*w,401) ax.set_xlim(*w) ax.set_ylim(*bounds(height)) ax.plot(w,[0,0],color='#888888', label='Nominal fit') ax.plot(*deskewed_data[:,1:].T, '.', color='#aaaaaa', zorder=-5) # axes correspond to max angular error axes = N.array([vector(0,1,0),vector(0,0,1)]) err = HyperbolicErrors(fit.singular_values,xvals,axes=axes) err.plot(ax, fc='#cccccc', alpha=0.3, label="Variance") hyp = sampling_axes(fit) err = HyperbolicErrors(hyp,xvals,axes=axes) err.plot(ax, fc='#ffcccc', alpha=0.3, label="Sampling-based") hyp = noise_axes(fit) err = HyperbolicErrors(hyp,xvals,axes=axes) err.plot(ax, fc='dodgerblue', alpha=0.3, label="Noise-based") if do_bootstrap: err_bands = bootstrap_ci(deskewed_data) ax.fill_between(xvals, *err_bands, facecolor="none",edgecolor='blue', alpha=.5, label="Noise bootstrap",linestyle='--') ax.legend() return fig