Problem drawing a TMultiGraph into an existing frame

Dear ROOTers,

it occurred to me that drawing a TMultiGraph sometimes has a different effect than drawing the individual TGraphs one after the other. When I draw the graphs into an existing frame, TMultiGraph will clutter the frame with its own axes whereas the TGraphs won’t do that. I am not sure if this is a ROOT bug, or if I am misunderstanding the drawing options of TMultiGraph. The following macro, based on the one at root.cern.ch/root/html/examples/ … aph.C.html, should illustrate this (just toggle Bool_t useTMultiGraph).

Thanks!

Thomas

{
   gROOT->Reset();
   gStyle->SetOptFit();
   c1 = new TCanvas("c1","multigraph",200,10,700,500);
   c1->SetGrid();

   Bool_t useTMultiGraph = kFALSE;

      // draw a frame to define the range
   TMultiGraph *mg = new TMultiGraph();

      // create first graph
   Int_t n1 = 10;
   Double_t x1[]  = {-0.1, 0.05, 0.25, 0.35, 0.5, 0.61,0.7,0.85,0.89,0.95};
   Double_t y1[]  = {-1,2.9,5.6,7.4,9,9.6,8.7,6.3,4.5,1};
   Double_t ex1[] = {.05,.1,.07,.07,.04,.05,.06,.07,.08,.05};
   Double_t ey1[] = {.8,.7,.6,.5,.4,.4,.5,.6,.7,.8};
   gr1 = new TGraphErrors(n1,x1,y1,ex1,ey1);
   gr1->SetMarkerColor(kBlue);
   gr1->SetMarkerStyle(21);
   gr1->Fit("pol6","q");
   mg->Add(gr1);

      // create second graph
   Int_t n2 = 10;
   Float_t x2[]  = {-0.28, 0.005, 0.19, 0.29, 0.45, 0.56,0.65,0.80,0.90,1.01};
   Float_t y2[]  = {2.1,3.86,7,9,10,10.55,9.64,7.26,5.42,2};
   Float_t ex2[] = {.04,.12,.08,.06,.05,.04,.07,.06,.08,.04};
   Float_t ey2[] = {.6,.8,.7,.4,.3,.3,.4,.5,.6,.7};
   gr2 = new TGraphErrors(n2,x2,y2,ex2,ey2);
   gr2->SetMarkerColor(kRed);
   gr2->SetMarkerStyle(20);
   gr2->Fit("pol5","q");

   mg->Add(gr2);

   TH1F* frame = c1->DrawFrame(-0.3,-3,1.2,12.);

   if (!useTMultiGraph) {
     gr1->Draw("psame");
     gr2->Draw("psame");
   } else {
     mg->Draw("psame");
   }

   c1->Update();

}

You should not use the option “same” in TGraph. Replace the end of your script with

if (!useTMultiGraph) { gr1->Draw("pe"); gr2->Draw("pe"); } else { mg->Draw("ape"); }

Rene

Okay, thanks!
You probably mean:

   if (!useTMultiGraph) {
     gr1->Draw("pe");
     gr2->Draw("pe");
   } else {
     mg->Draw("pe");
   } 

Thomas

Sorry for the typo. However “ape” will work too ::slight_smile:

Rene