123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """A polynomial fit of degree="""
- from vedo import np, precision, Text3D, DashedLine, show
- from vedo.pyplot import plot, fit, histogram
- # np.random.seed(0)
- n = 25 # nr of data points to generate
- deg = 3 # degree of the fitting polynomial
- # Generate some noisy data points
- x = np.linspace(0, 12, n)
- y = (x-6)**3 /50 + 6 # the "truth" is a cubic function!
- xerrs = np.linspace(0.4, 1.0, n) # make last points less precise
- yerrs = np.linspace(1.0, 0.4, n) # make first points less precise
- noise = np.random.randn(n)
- # Plot the noisy points with their error bars
- fig1 = plot(
- x, y+noise,
- ".k",
- title=__doc__+str(deg),
- xerrors=xerrs,
- yerrors=yerrs,
- aspect=4/5,
- xlim=(-3,15),
- ylim=(-3,15),
- padding=0,
- )
- fig1 += DashedLine(x, y, c='r')
- # Fit points and evaluate, with a bootstrap and Monte-Carlo technique,
- # the correct errors and error bands. Return a Line object:
- pfit = fit(
- [x, y+noise],
- deg=deg, # degree of the polynomial
- niter=500, # nr. of MC iterations to compute error bands
- nstd=2, # nr. of std deviations to display
- xerrors=xerrs, # optional array of errors on x
- yerrors=yerrs, # optional array of errors on y
- vrange=(-3,15), # specify the domain of fit
- )
- fig1 += [pfit, pfit.error_band, pfit.error_lines] # add these objects to Figure
- # Add some text too
- txt = "fit coefficients:\n " + precision(pfit.coefficients, 2) \
- + "\n:pm" + precision(pfit.coefficient_errors, 2) \
- + "\n:Chi^2_:nu = " + precision(pfit.reduced_chi2, 3)
- fig1 += Text3D(txt, s=0.42, font='VictorMono').pos(4,-2).c('k')
- # Create a 2D histo to show the correlation of fit parameters
- fig2 = histogram(
- pfit.monte_carlo_coefficients[:,0],
- pfit.monte_carlo_coefficients[:,1],
- title="parameters correlation",
- xtitle='coeff_0', ytitle='coeff_1',
- cmap='ocean_r',
- scalarbar=True,
- )
- show(fig1, fig2, N=2, sharecam=False, zoom='tight').close()
|