2.3.1 填充属性

基本颜色

root中有50种(0-50)基本颜色,你可以通过数字使用它们:

明亮颜色

root 支持 Web 应用程序的 216 种颜色。 通过色彩索引编码 300-1000 或者色彩名称 kRed、kBlue、kYellow、kPink 等或 kRed+5 等使用。

完整的颜色与数字对应如下:

kWhite  = 0,   kBlack  = 1,   kGray    = 920,  kRed    = 632,  kGreen  = 416,
kBlue   = 600, kYellow = 400, kMagenta = 616,  kCyan   = 432,  kOrange = 800,
kSpring = 820, kTeal   = 840, kAzure   =  860, kViolet = 880,  kPink   = 900

RGB色彩

root 也支持 RGB 色彩编码规则TColor::SetRGB

root [1] auto *color = gROOT->GetColor(1)
(TColor *) 0x600002c5ff00
root [3] auto *c1 = new TCanvas
root [3] color->SetRGB(0.5,0.5,0.5)
root [4] c1->SetFillColor(color->GetNumber())
root [5] c1->Draw()
// ================================ 不编码使用
root [6] color->SetRGB(241./255, 243./255, 229./255)    // SetGRB函数中三位参数用百分比表示
root [7] c1->SetFillColor(color->GetNumber())
root [8] c1->Draw()
// ================================
root [9] TColor *color = new TColor(1000, 0.1, 0.2, 0.3);
Warning in <TColor::TColor>: color 1000 already defined
root [10] c1->SetFillColor(1000)
root [11] c1->Draw()
root [12] TColor *color = new TColor(1500, 0.1, 0.2, 0.3);
root [13] c1->SetFillColor(1500)
root [14] c1->Draw()
root [15] TColor *color = new TColor(1500, 0., 1., 1.);
Warning in <TColor::TColor>: color 1500 already defined
root [16] c1->SetFillColor(1500)
root [17] c1->Draw()
root [18] TColor *color = new TColor(1501, 0., 1., 1.);
root [19] c1->SetFillColor(1501)
// ================================ 编码使用,但是重复编码的颜色不会生效

透明视图

此函数也用于SetFillColorAlpha()、SetLineColorAlpha()、SetMarkerColorAlpha()SetTextColorAlpha()

h1->SetFillColorAlpha(kBlue, 0.35);

在示例中,直方图的填充色为蓝色,不透明度为35%。

灰度视图

使用TCanvas::SetGrayscale()在灰度预览和常规彩色模式之间切换。

{
   TColorWheel *w = new TColorWheel();
   cw = new TCanvas("cw","cw",0,0,400,400);
   cw->GetCanvas()->SetGrayscale();
   w->SetCanvas(cw);
   w->Draw();
}

调色板/色带

用颜色的变化表示变量非常有用:这就是“调色板”的概念,设置调色板的函数是:

gStyle->SetPalette();

默认风格为57,还有其他风格63种:

kDeepSea=51,          kGreyScale=52,    kDarkBodyRadiator=53,
kBlueYellow= 54,      kRainBow=55,      kInvertedDarkBodyRadiator=56,
kBird=57,             kCubehelix=58,    kGreenRedViolet=59,
kBlueRedYellow=60,    kOcean=61,        kColorPrintableOnGrey=62,
kAlpine=63,           kAquamarine=64,   kArmy=65,
kAtlantic=66,         kAurora=67,       kAvocado=68,
kBeach=69,            kBlackBody=70,    kBlueGreenYellow=71,
kBrownCyan=72,        kCMYK=73,         kCandy=74,
kCherry=75,           kCoffee=76,       kDarkRainBow=77,
kDarkTerrain=78,      kFall=79,         kFruitPunch=80,
kFuchsia=81,          kGreyYellow=82,   kGreenBrownTerrain=83,
kGreenPink=84,        kIsland=85,       kLake=86,
kLightTemperature=87, kLightTerrain=88, kMint=89,
kNeon=90,             kPastel=91,       kPearl=92,
kPigeon=93,           kPlum=94,         kRedBlue=95,
kRose=96,             kRust=97,         kSandyTerrain=98,
kSienna=99,           kSolar=100,       kSouthWest=101,
kStarryNight=102,     kSunset=103,      kTemperatureMap=104,
kThermometer=105,     kValentine=106,   kVisibleSpectrum=107,
kWaterMelon=108,      kCool=109,        kCopper=110,
kGistEarth=111,       kViridis=112,     kCividis=113

调色板反置

如果调色板的色彩呈现你不满意,可以尝试调色板反置TColor::InvertPaletteE.g.

{
   auto c  = new TCanvas("c","c",0,0,600,400);
   TF2 *f2 = new TF2("f2","0.1+(1-(x-2)*(x-2))*(1-(y-2)*(y-2))",0.999,3.002,0.999,3.002);
   f2->SetContour(99); gStyle->SetPalette(kCherry);
   TColor::InvertPalette();
   f2->Draw("surf2Z"); f2->SetTitle("kCherry inverted");
}

调色板上下限

在绘制图像或热力图时,色带用于表示不同数值范围的颜色。通过设置色带的下限和上限,可以控制绘制图像时所使用的颜色范围。

SetMinimum()将色带的下限设置为某值,确保最小值的数据点在图像中不以颜色显示。

SetMaximum()将色带的上限设置为某值,这意味着色带中最高的数值对应的颜色将被映射为绘制图像中的最高颜色。通过设置上限,可以控制图像中最大值的数据点所显示的颜色。

通过设置色带的下限和上限,可以调整图像的对比度和颜色映射,以更好地展示数据的分布和变化。

使用gPad->SetLogz()设置调色板为log的形式展示

调色板位置

E.g.
void movepalette()
{
   auto c = new TCanvas("", "",0,0,1100,550);
   c->Divide(2,1);
   gStyle->SetOptStat(0);

   auto h1 = new TH2D("h1","h1",40,-4,4,40,-20,20);
   auto h2 = new TH2D("h2","h2",40,-4,4,40,-20,20);
   float px, py;
   for (int i = 0; i < 25000; i++) {
      gRandom->Rannor(px,py); h1->Fill(px,5*py);
      gRandom->Rannor(px,py); h2->Fill(px,5*py);
   }

   TPad *p1 = (TPad *)c->cd(1);
   TPad *p2 = (TPad *)c->cd(2);

   p1->SetRightMargin(0.15);
   auto palette1 = new TPaletteAxis(4.05,-15,4.5,15,h1);
   h1->GetListOfFunctions()->Add(palette1);

   p2->SetBottomMargin(0.2);
   auto palette2 = new TPaletteAxis(-3.,-25,3.,-23,h2);
   h2->GetListOfFunctions()->Add(palette2);

   p1->cd(); h1->Draw("colz");
   p2->cd(); h2->Draw("colz");
}

调色板刻度

加密和疏松或者单独控制调色板刻度均使用SetContour()函数,例如加密刻度可以使用SetContour(100)

E.g. 独立控制刻度范围
{
   gStyle->SetOptStat(0);
   auto c = new TCanvas("c","exa_CJUST",300,10,400,400);
   auto hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
   // Fill histograms randomly
   TRandom3 randomNum;
   Float_t px, py;
   for (Int_t i = 0; i < 25000; i++) {
      randomNum.Rannor(px,py);
      hpxpy->Fill(px,py);
   }
   hpxpy->SetMaximum(200);
   Double_t zcontours[5] = {0, 20, 40, 80, 120};
   hpxpy->SetContour(5, zcontours);
   hpxpy->GetZaxis()->SetTickSize(0.01);
   hpxpy->GetZaxis()->SetLabelOffset(0.01);
   gPad->SetRightMargin(0.13);
   hpxpy->SetTitle("User contours, CJUST");
   hpxpy->Draw("COL Z CJUST");
}

调色板平滑

TColor::CreateGradientColorTable ( UInt_t Number, Double_t Length, Double_t * Red, Double_t * Green, Double_t * Blue, UInt_t NColors, Float_t alpha, Bool_t setPalette = kTRUE )

创建具有多个连接的线性渐变的颜色表的静态函数。

  • Number:渐变的颜色数量,至少为 2。

  • Length:颜色在调色板中的位置。每个元素必须位于 [0, 1] 上,每个元素必须大于前一个元素。

  • 红、绿、蓝:色值。每个元素必须位于 [0, 1]。

  • NColors:调色板刻度。

  • alpha:不透明度系数。

  • setPalette:激活新创建的调色板(默认为true)。

{
	TCanvas *c2  = new TCanvas("c2","c2",0,0,600,400);
	TF2 *f2 = new TF2("f2","0.1+(1-(x-2)*(x-2))*(1-(y-2)*(y-2))",1,3,1,3);
	const int Number = 3;

	Double_t Red[]    = {0., 0.0, 1.0, 1.0, 1.0};
	Double_t Green[]  = {0., 0.0, 0.0, 1.0, 1.0};
	Double_t Blue[]   = {0., 1.0, 0.0, 0.0, 1.0};
	Double_t Length[] = {0., .25, .50, .75, 1.0};

/*	
	Double_t Red[Number]    = { 0.00, 0.00, 0.00};
	Double_t Green[Number]  = { 1.00, 0.60, 0.00};
	Double_t Blue[Number]   = { 1.00, 1.00, 1.00};
	Double_t Length[Number] = { 0.00, 0.5, 1.00 };
*/
/*
	Double_t Red[3]   = { 0.0, 1.0, 1.0 };
	Double_t Green[3] = { 0.0, 0.0, 1.0 };
	Double_t Blue[3]  = { 1.0, 0.0, 1.0 };
	Double_t Length[3] = { 0.0, 0.4, 1.0 };
*/
/*
	Double_t Red[Number]    = { 0.00, 1.00, 1.00};
	Double_t Green[Number]  = { 0.00, 0.60, 1.00};
	Double_t Blue[Number]   = { 0.00, 0.00, 1.00};
	Double_t Length[Number] = { 0.00, 0.50, 1.00 };
*/	
	int nb=50;
	TColor::CreateGradientColorTable(5,Length,Red,Green,Blue,nb);
//	TColor::CreateGradientColorTable(Number,Length,Red,Green,Blue,nb);
	f2->SetContour(nb);
	f2->SetLineWidth(1);
	f2->SetLineColor(kBlack);
	f2->Draw("surf1z");
	return c2;
}

调色板颜色

使用的颜色表以当前样式定义。

如果直方图的最小值和最大值相同(平面直方图),则无法绘制颜色图,因此没有绘制任何东西。 要绘制平面直方图,只需设置与垃圾箱内容不同的直方图最小值(TH1::SetMinimum())。

用于绘制单元格的默认颜色级别数为20。 它可以使用TH1::SetContour()或TStyle::SetNumberContours()进行更改。 这个数字越高,单元格之间的颜色变化就越平滑。

TStyle中的调色板可以通过gStyle->SetPalette()进行修改。

所有非空垃圾箱都涂上了油漆。 除非一些垃圾箱有负面内容,否则不会油漆空垃圾箱,因为在这种情况下,空垃圾箱可能不是空的。

or

f2->SetContour(nb);

调色板刻度线

h_myHisto->GetZaxis()->SetTickLength(0.35);

移除 bin 的边框

hpxpy->SetLineColorAlpha(10, 0.) hpxpy->Draw("colz pol")

填充风格 Fill Area style

任何类的填充区域样式都可以使用SetFillStyle()方法进行更改。

  • SetFillStyle(4000-4100)意为0%填充(透明)至100%填充(不透明)。

  • gStyle->SetHatchesSpacing()定义阴影之间的间距。

  • gStyle->SetHatchesLineWidth()定义阴影线宽度。适用3100以上。

自动填充颜色

参考2.3图表绘图选项

在其他Pad上绘制调色板

{
   hpxpy->Draw("colz");
   gPad->Update();
   TPaletteAxis *palette = (TPaletteAxis*)hpxpy->GetListOfFunctions()->FindObject("palette");
   TCanvas *c2 = new TCanvas();
   c2->cd();
   palette->Draw();
}

参考


https://root.cern/doc/master/classTColor.html#TColor:SetPalette

https://root.cern/doc/master/classTPaletteAxis.html

配色方案
渐变配色方案

Last updated