from array import array from ROOT import ( TF1, TF2, TH1D, TH1F, TH2D, TH2F, TCanvas, TFormula, gRandom, kAzure, kBlack, kBlue, kGray, kGreen, kOrange, kPink, kRed, kSpring, kTeal, kViolet, kYellow, ) # on:开启交互; off:显示图片; debug:显示图片与交互 %jsroot off ♪² 预置函数绘制 # 创建一个叫c1的画布,标题为Histograms Exmple,画布宽600,高900 c1 = TCanvas("c1", "Histograms Exmple", 800, 600) # 创建一个叫h1d1,标题为TH1D Exmple,把[-10,10]区间分为200个小区间的直方图 h1d1 = TH1D("h1d1", "TH1D Exmple", 200, -10, 10) # FillRandom 用于高斯分布、泊松分布等填充。 h1d1.FillRandom("gaus", 10000) # 使用gaus,并填充10000个数据 h1d1.Draw() c1.Draw() ♪² 自定义函数绘制 myFormula1 = TFormula("myFormula1", "[0]*x") a = 2.0 # 定义一个Formula: y = ax myFormula1.SetParameter(0, a) # TF1 参数2是定义的函数 sqroot = TF1("sqroot", "myFormula1") # 创建一个叫h1d1,标题为TH1D Exmple,把[-10,10]区间分为200(bins)个小区间的直方图 h1d2 = TH1D("h1d2", "TH1D Exmple", 200, 0, 10) # FillRandom 第一个参数是函数名可以是1父类TF1或者TFormula创建 h1d2.FillRandom("sqroot", 100000) # 使用gaus函数,并填充10000个数据到200个小区间(bins)中 h1d2.Fit("sqroot") # 函数拟合 h1d2.Draw() c1.Draw() # 下面并不是线性关系是因为填充数据太少,越多越成线性 FCN=213.99 FROM MIGRAD STATUS=CONVERGED 14 CALLS 15 TOTAL EDM=1.17174e-12 STRATEGY= 1 ERROR MATRIX ACCURATE EXT PARAMETER NO. NAME 1 p0 VALUE 9.97860e+01 ERROR 3.15889e-01 ♪² 1维直方图(基本函数) c4 = TCanvas("c4", "1维 Base Exmple", 720, 800) c4.Divide(1, 2) # 分为1列2行 # 画布设置网格 c4.SetGrid() # xy 同时设置 # c4.SetGridx() # 设置 x 方向 # c4.SetGridy() # 设置 y 方向 STEP SIZE 2.26159e-03 FIRST DERIVATIVE -4.84615e-06 c4.SetFillColor(kTeal) # 设置画布颜色 # TF1 参数2是定义的函数 sqroot4 = TF1("sqroot4", "gaus") sqroot4.SetParameters(10, 4, 1) # 子图1 c4.cd(1) # 创建一个叫h1d1,标题为TH1D Exmple,把[-10,10]区间分为200个小区间的直方图 h1d4 = TH1D("h1d4", "TH1D Exmple", 200, 0, 8) # FillRandom 第一个参数是函数名可以是1父类TF1或者TFormula创建 h1d4.FillRandom("sqroot4", 100000) # 使用gaus,并填充100000个数据 # h1d4.SetStats(0) # 在绘图中是否显示统计信息,默认显示 h1d4.SetFillColor(kPink - 25) # 绘图对象的填充颜色 # X/Y轴相关函数 h1d4.SetTitle("这是Title") # 设置大标题 h1d4.SetXTitle("这是X轴") # 设置X轴标题 h1d4.SetYTitle("这是Y轴") # 设置Y轴标题 h1d4.SetAxisColor(kGreen) # 设置X轴颜色(绿色) h1d4.SetLabelColor(kOrange + 1) # 设置标签颜色(橘色) # h1d4.SetAxisRange(0,5) # 限制坐标轴的显示范围,默认为 X # h1d4.SetAxisRange(0,800,"Y") 限制Y坐标轴的显示范围 # 绘制线条函数 h1d4.SetLineWidth(3) # 设置线条宽度 h1d4.SetLineColor(kBlue) # 设置线条颜色 # 函数拟合 h1d4.Fit("sqroot4") h1d4.Draw() # 子图2 c4.cd(2) hc = h1d4.GetCumulative() hc.Draw() # 创建累积直方图对象 hc。(积分函数) # 小区间(bin)操作 print("---->获取小区间个数(bins)", h1d4.GetNbinsX()) # 获取bins maximumBin = h1d4.GetMaximumBin() # 获取具有最大个数的 小区间(bin) 的序号(索引) maximum = h1d4.GetBinContent(maximumBin) # 通过索引获取对应小区间(bin)中数据的个数 print(f"---->最大 bin 的索引:{maximumBin},最大值:{maximum}\n") # 通过bin获取总数据量 sum = 0 for i in range(h1d4.GetNbinsX() + 1): sum += h1d4.GetBinContent(i) # GetMaximum 函数可直接获取最大值 # print(i,) print(f"---->过bin获取总数据量:{sum}") # 区间数据量 # Integral 获取数据的size,或者获取[a,b]区间的数据size print(f"---->全部数据量:{h1d4.Integral()}") a, b = 2, 20 print(f"---->[{a},{b}]区间数据量:{h1d4.Integral(a,b)}\n") # Interpolate 基于两个最近的 bin 中心的线性插值来近似计算该值。 x = 4 print(f"---->在 x = {x} 时的近似值:{h1d4.Interpolate(x)}\n") # GetXaxis 获取 X 轴属性并进行修改 print("---->修改前的 X 轴属性:", h1d4.GetXaxis()) h1d4.GetXaxis().SetTitle("修改X轴标题") print("---->修改后的 X 轴属性:", h1d4.GetXaxis()) c4.Draw() ---->获取小区间个数(bins) 200 ---->最大 bin 的索引:102,最大值:1646.0 ---->过bin获取总数据量:100000.0 ---->全部数据量:100000.0 ---->[2,20]区间数据量:72.0 ---->在 x = 4 时的近似值:1565.4999999999998 ---->修改前的 X 轴属性: Name: xaxis Title: 这是X轴 ---->修改后的 X 轴属性: Name: xaxis Title: 修改X轴标题 FCN=192.969 FROM MIGRAD STATUS=CONVERGED EDM=9.57406e-11 STRATEGY= EXT PARAMETER NO. NAME VALUE ERROR 1 2 3 Constant Mean Sigma 1.59612e+03 3.99930e+00 9.97996e-01 6.15601e+00 3.16252e-03 2.20383e-03 64 CALLS 65 TOTAL 1 ERROR MATRIX ACCURATE STEP FIRST SIZE DERIVATIVE 3.43576e-02 2.15058e-05 4.10166e-06 2.27001e-06 2.19956e-03 1.55672e-02 ♪² 2维直方图 nx = 12 ny = 20 month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ] people = [ "Jean", "Pierre", "Marie", "Odile", "Sebastien", "Fons", "Rene", "Nicolas", "Xavier", "Greg", "Bjarne", "Anton", "Otto", "Eddy", "Peter", "Pasha", "Philippe", "Suzanne", "Jeff", "Valery", ] c5 = TCanvas("c5", "二维 Base Exmple", 10, 10, 600, 600) c5.SetGrid() # 设置网格 c5.SetLeftMargin(0.15) # 设置画布的左边缘的边距 c5.SetBottomMargin(0.15) # 设置画布的底边缘的边距 h2d1 = TH2F("h2d1", "TH2D Exmple", 3, 0, 3, 2, 0, 2) h2d1.SetCanExtend(TH2F.kAllAxes) # 允许直方图在所有轴上扩展 h2d1.SetStats(0) # 设置直方图的统计框是否显示 gRandom.SetSeed() for i in range(1500): rx = gRandom.Rndm() * nx ry = gRandom.Rndm() * ny h2d1.Fill(people[int(ry)], month[int(rx)], 1) h2d1.LabelsDeflate("X") h2d1.LabelsDeflate("Y") h2d1.LabelsOption("v") h2d1.Draw("text") c5.Draw() import ctypes c6 = TCanvas("c6", "c6", 600, 600) c6.Divide(2, 3) hscc = TH2F("hscc", "Cylindrical coordinates", 20, -4, 4, 20, -20, 20) # 圆柱坐标/柱面坐标 px_ref, py_ref = ctypes.c_float(), ctypes.c_float() for i in range(25000): gRandom.Rannor(px_ref, py_ref) px = px_ref.value py = py_ref.value hscc.Fill(px - 1,5 * py) hscc.Fill(2 + 0.5 * py, 2 * py - 10, 0.1) # 0.1代表权重,默认为1,人为操作这个事例的重要性,有时候代 表改了问题 # 二维数据画出三维图形是因为 Z数据,Z数据是分割的小区间里面的数据个数 c6.cd(1) hscc.Draw("SURF1 CYL") c6.cd(2) hspc = hscc.DrawClone("SURF1 POL") hspc.SetTitle("Polar coordinates") # 极坐标 c6.cd(3) hssc = hscc.DrawClone("SURF1 SPH") hssc.SetTitle("Spherical coordinates") # 球坐标 c6.cd(4) hsprpc = hscc.DrawClone("SURF1 PSR") hsprpc.SetTitle("PseudoRapidity/Phi coordinates") # 伪快度/角度坐标 c6.cd(5) hscc.Draw() c6.Draw() %jsroot off