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

From: Christian Hansen <christian.hansen_at_cern.ch>
Date: Tue, 8 Mar 2005 15:52:18 +0100 (CET)


On Tue, 8 Mar 2005, Hajime Nanjo wrote:

Thank you very much Hajime!

I've used your code in my program now and it works as I wanted. Thanks!

/Christian

> 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");
> > >
> > > }
>

-- 
/ 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
Received on Tue Mar 08 2005 - 16:01:03 MET

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