Uploaded by ze zhuge

Histograms

advertisement
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
Download