auto r = ROOT::R::TRInterface::Instance(); %jsroot on auto c = new TCanvas("c"); TH1D h1("h1", "h1", 256, -4, 4); h1.FillRandom("gaus"); ROOT::Math::MinimizerOptions::SetDefaultMinimizer("RMinimizer","BFGS"); h1.Fit("gaus"); c->Draw(); // draw a frame to define the range TMultiGraph mg; const Int_t n = 24; Double_t x[n] ; Double_t y[n] ; TRandom rg; rg.SetSeed(520); for (Int_t i = 0; i < n; i++) { x[i] = rg.Uniform(0, 1); y[i] = TMath::Power(x[i], 3) + rg.Gaus() * 0.06; } %%cpp -d void SetPointStyle(TGraph& g, Int_t color) { g.SetMarkerColor(color); g.SetFillColor(kWhite); g.SetMarkerStyle(8); g.SetMarkerSize(1); } TGraph gr1(n,x,y); SetPointStyle(gr1, kBlue); mg.Add(&gr1); TF1 f_known("f_known","pow(x,3)",0,1); TGraph gr2(&f_known); SetPointStyle(gr2, kRed); mg.Add(&gr2); TVectorD vx(n, x); TVectorD vy(n, y); r["x"]=vx; r["y"]=vy; r<<"ds<-data.frame(x=x,y=y)"; r << "m <- nls(y ~ I(x^power),data = ds, start = list(power = 1),trace = T)"; Double_t power; r["summary(m)$coefficients[1]"] >> power; TCanvas c1("c1", "Curve Fitting", 700, 500); c1.SetGrid(); TF1 f_fitted("f_fitted","pow(x,[0])",0,1); f_fitted.SetParameter(0,power); TGraph gr3(&f_fitted); SetPointStyle(gr3, kGreen); mg.Add(&gr3); mg.Draw("ap"); TLegend leg(0.1,0.6,0.5,0.9,"brNDC"); leg.SetHeader("Fitting x^power"); leg.AddEntry(&gr1, "Points with gaussian noise to be fitted", "P"); leg.AddEntry(&gr2, "Known function x^3", "P"); TString fmsg; fmsg.Form(" \"Green\" Fitted function with power=%.4lf",power); leg.AddEntry(&gr3, fmsg, "P"); leg.Draw(); c1.Draw();