Re: Re: [ROOTDEV] Strange FillStyle for THStack?

From: Hajime Nanjo <nanjyo_at_icepp.s.u-tokyo.ac.jp>
Date: Tue, 08 Mar 2005 17:24:18 +0900


Dear Rene,

I also feel inconvenience for the expedted behavior of the FillStyle for THStack.

I prepared three plots as follows and they can be created with a script below.

Fig.1 : THStack::Draw("nostack"); //Hatches are blended.
Fig.2 : THStack::Draw();  //Hatches are blended.
Fig.3 : Stacked histograms with TH1::Draw("same"),
        which can be seen as hatches are not blended.

I am satisfied with the view of Fig.1.

I feel inconvenience for the case of Fig.2. In Fig2, the fill style of the legends don't match that of the histograms. Moreover, if I stack many histograms with THStack, a view of a lower stacked hisotgram becomes indistinguishable.

So I would like to present the stacked histograms with THStack like Fig.3. I think it is helpful if THStack::Draw() support a option to present stacked histograms like Fig.3.

Could you implement such a option someday? Best Regards,
Hajime

/////////////////////////////////////////////////////////////////
//
{
  TCanvas *c1 = new TCanvas("c1","c1",800,600);   c1->Divide(2,2);
  //-------------------------------------------
  TH1F *h1 = new TH1F("h1","Histo 1",100,-5,5);   h1->FillRandom("gaus",10000);
  //-------------------------------------------
  TF1* gaus = (TF1*)gROOT->FindObject("gaus");   gaus->SetParameter(1,1.5);
  gaus->SetParameter(2,0.3);
  TH1F *h2 = new TH1F("h2","Histo 2",100,-5,5);
  h2->FillRandom("gaus",20000);
  //-------------------------------------------
  h1->SetFillStyle(3004);
  h1->SetFillColor(1);
  h2->SetFillStyle(3005);
  h2->SetFillColor(1);
  //-------------------------------------------
  THStack *hs = new THStack("hs","A stack of histograms");
  hs->Add(h1);
  hs->Add(h2);
  //-------------------------------------------
  TLegend *leg = new TLegend(0.1,0.6,0.4,0.9);
  leg->AddEntry(h1,"h1","f");
  leg->AddEntry(h2,"h2","f");
  //-------------------------------------------

  
  //-------------------------------------------
  c1->cd(1);

  hs->SetTitle("hatch THStack::Draw(\"nostack\")");   hs->DrawClone("nostack");
  leg->DrawClone();
  //-------------------------------------------


  //-------------------------------------------
  c1->cd(2);

  hs->SetTitle("hatch THStack::Draw()");   hs->DrawClone();
  leg->DrawClone();
  //-------------------------------------------

  
  //-------------------------------------------
  c1->cd(3);
  TH1F* h0 = (TH1F*)h1->Clone("h0");
  h0->SetTitle("hatch TH1F::Draw(\"same\")");
  h0->Add(h2);
  h0->SetStats(0);
  TH1F* h1w  = (TH1F*)h1->Clone("h1w");

  h0->SetFillStyle(h2->GetFillStyle());
  h0->SetFillColor(h2->GetFillColor());
  h1w->SetFillStyle(1001);
  h1w->SetFillColor(c1->GetFillColor());   h0->DrawClone();
  h1w->DrawClone("same");
  h1->DrawClone("same");
  TLegend *leg2 = new TLegend(0.1,0.6,0.4,0.9);
  leg2->AddEntry(h1,"h1","f");
  leg2->AddEntry(h0,"h2","f");
  leg2->DrawClone();

  delete h0;
  delete h1w;
  delete leg2;
  //-------------------------------------------
  

  c1->cd();
  c1->SaveAs("c1.ps");   

}

/////////////////////////////////////////////////////////////////














>
> Hi Christian,
>
> This is the expected behaviour. Each histogram in the stack is paint
> on top of the previous one. One could modify the algorithm to paint
> only the difference between histograms, but this requires a bit of work
> to take into account correctly the bins with no content.
>
> Rene brun
>
> Christian Hansen wrote:
> > Dear Rooters,
> >
> > is there anyway to stop fill styles of different
> > histograms in a histogram stack to mix?
> >
> > For example, I used $ROOTSYS/tutorials/hstack.C
> > and added only three lines (see attachement);
> > h1->SetFillStyle(3007);
> > h2->SetFillStyle(3004);
> > h3->SetFillStyle(3006);
> >
> > The result from the edited hstack.C shows in the
> > upper left corner the stacked histograms, but now
> > with different fill styles.
> >
> > One can see that the green vertical lines of h3
> > continues down and fills also h2 and h1. Is there
> > a way to force h1 to ONLY be filled with the red
> > horisontal lines, h2 to ONLY be filled with the
> > blue leaning lines and h3 to only be filled with
> > the green vertical lines?
> >
> > Best regards
> > / Christian Hansen
> >
> > ===============================================
> > Box 535 Office: +46-(0)18-471 32 57
> > S-751 21 Uppsala Office: 82104
> > Sweden
> > -----------------------------------------------
> > Mobile : +46-(0)708-887617
> > Home Page : http://welcome.to/Christian_Hansen
> > http://www.cern.ch/Christian.Hansen
> >
> >
> > ------------------------------------------------------------------------
> >
> > void hstack() {
> > // Example of stacked histograms: class THStack
> > //
> > // Author: Rene Brun
> >
> > THStack *hs = new THStack("hs","test stacked histograms");
> > //create three 1-d histograms
> > TH1F *h1 = new TH1F("h1","test hstack",100,-4,4);
> > h1->FillRandom("gaus",20000);
> > h1->SetFillColor(kRed);
> > h1->SetFillStyle(3007); // <-- NEW
> > h1->SetMarkerStyle(21);
> > h1->SetMarkerColor(kRed);
> > hs->Add(h1);
> > TH1F *h2 = new TH1F("h2","test hstack",100,-4,4);
> > h2->FillRandom("gaus",15000);
> > h2->SetFillColor(kBlue);
> > h2->SetFillStyle(3004); // <-- NEW
> > h2->SetMarkerStyle(21);
> > h2->SetMarkerColor(kBlue);
> > hs->Add(h2);
> > TH1F *h3 = new TH1F("h3","test hstack",100,-4,4);
> > h3->FillRandom("gaus",10000);
> > h3->SetFillColor(kGreen);
> > h3->SetFillStyle(3006); // <-- NEW
> > h3->SetMarkerStyle(21);
> > h3->SetMarkerColor(kGreen);
> > hs->Add(h3);
> >
> > TCanvas *c1 = new TCanvas("c1","stacked hists",10,10,1000,800);
> > c1->SetFillColor(41);
> > c1->Divide(2,2);
> > // in top left pad, draw the stack with defaults
> > c1->cd(1);
> > hs->Draw();
> > // in top right pad, draw the stack in non-stack mode and errors option
> > c1->cd(2);
> > gPad->SetGrid();
> > hs->Draw("nostack,e1p");
> > //in bottom left, draw in stack mode with "lego1" option
> > c1->cd(3);
> > gPad->SetFrameFillColor(17);
> > gPad->SetTheta(3.77);
> > gPad->SetPhi(2.9);
> > hs->Draw("lego1");
> >
> > c1->cd(4);
> > //create two 2-D histograms and draw them in stack mode
> > gPad->SetFrameFillColor(17);
> > THStack *a = new THStack("a","test legos");
> > TF2 *f1 = new TF2("f1","xygaus + xygaus(5) + xylandau(10)",-4,4,-4,4);
> > Double_t params[] = {130,-1.4,1.8,1.5,1, 150,2,0.5,-2,0.5, 3600,-2,0.7,-3,0.3};
> > f1->SetParameters(params);
> > TH2F *h2a = new TH2F("h2a","h2a",20,-4,4,20,-4,4);
> > h2a->SetFillColor(38);
> > h2a->FillRandom("f1",4000);
> > TF2 *f2 = new TF2("f2","xygaus + xygaus(5)",-4,4,-4,4);
> > Double_t params[] = {100,-1.4,1.9,1.1,2, 80,2,0.7,-2,0.5};
> > f2->SetParameters(params);
> > TH2F *h2b = new TH2F("h2b","h2b",20,-4,4,20,-4,4);
> > h2b->SetFillColor(46);
> > h2b->FillRandom("f2",3000);
> > a->Add(h2a);
> > a->Add(h2b);
> > a->Draw();
> >
> > c1->Print("stackTest.eps");
> >
> > }
Received on Tue Mar 08 2005 - 09:24:39 MET

This archive was generated by hypermail 2.2.0 : Tue Jan 02 2007 - 14:45:05 MET