Re: Pretty Palette Spectrum Violet->Red HowTo:

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sun Jun 27 1999 - 01:40:44 MEST


Hi Jon,
Thanks for posting this example. There are a few problems
with your implementation. I have added a new option
in TStyle::SetPalette to define a blue->red palette
that can be used by the surface/lego/contour algorithms.
This new feature will appear in Root 2.22/07.

Rene Brun

On Fri, 25 Jun 1999, Jon Gans wrote:

> //   To run: save as color.C, type ".L color.C" then "main()"
> 
> //   Create a new color palette with colors ranging
> //   from blue (low) to red (high).
> //
> //   How it works:
> //   We have to assign a new color palette to the global
> //   instance of TStyle called gStyle.
> //   This palette is simply an array of integers which hold
> //   the color ID for the referring level.
> //   In ROOT colors are created through TColor where they also
> //   get their ID assigned.
> //   ROOT reserves all colors below 50 and above 100.
> //   Here we restrict ourselves to the 50 IDs from 51 to 100.
> //
> //   The color model used here is based on the HLS model which
> //   is much more suitable for creating palettes than RGB.
> //   Fixing the saturation and lightness we can scan through the
> //   spectrum of visible light by using "hue" alone.
> //   In Root hue takes values from 0 to 360.
> //
> //   Problems: Often it is not possible to allocate a new color.
> //   This is especially true in X11. ROOT unfortunately gives no
> //   direct information on the success of TColor. There is however
> //   a workaround which is used here and shall not be explained
> //   in detail. If we fail to allocate one color we simply use the
> //   last successfully allocated color.
> //   This makes the macro independent of the graphics package and
> //   the underlying hardware.
> //
> 
> 
> void palette()
> {  
>   const float  saturation = 1;
>   const float  lightness = 0.5;
>   const float  MaxHue = 280;
>   const float  MinHue = 0;
>   const int    MaxColors = 50;   
>   int          palette[MaxColors];
>   int          index;
>   float        hue, r, g, b, rv, gv, bv;
>   TColor       *color;
>   unsigned int failures = 0;
>   
>   for (int i=0 ; i<MaxColors ; i++) {
>       index = palette[i] = MaxColors+1+i;     
>       color = new TColor(index, 0, 0, 0);
>       hue = MaxHue-(i+1)*((MaxHue-MinHue)/MaxColors);
>       color->HLStoRGB(hue, lightness, saturation, r, g, b);
>       color->SetRGB(r, g, b);
>       gGXW->GetRGB(index, rv, gv, bv);
>       if (r != rv || g != gv || b != bv) {
>           failures++;
>           palette[i] =  i ? palette[i-1] : 1;
>       }
>   }
>   if (failures)
>       printf("palette(): couldn't allocate %d of %d colors\n", failures, MaxColors);
>   gStyle->SetPalette(MaxColors, palette);
> }
> 
> 
> //
> // The following macro will produce an example figure
> //
> int main()
> {
>   gROOT->Reset();
>   
>   palette(); // Call The Palette Function
>   TCanvas *c1 = new TCanvas("c1","Spectrum Palette",200,10,900,500);
>   c1->Divide(2,1); 
>   
>   // Generate a 2-D function
>   TF2 *f2 = new TF2("f2","exp( -5.*(x^2+y^2)^(1/2))*cos((x^2+y^2)^(1/2)*10.0) ",-1.0,1.0,-1.0,1.0); // Example graph
> 
>   //The following calls are important to set up the color scheme for the 'f2' calls.
>  
>   f2->SetContour(48);   // This is needed to use all 50 colors. (If above 48 it will cycle through color map).
>   f2->SetFillColor(0);  // If using a histogram it is not nessesary.
>   
>   c1->cd(1);
>   f2->Draw("SURF1");
> 
>   c1->cd(2);
>   f2->Draw("COLZ");
>   
>   return 0;
> }
> 
> 
> 
> 
> 



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:34 MET