我是python和root的新手。以前,我一直在C ++环境中使用ROOT。 按照uproot教程,我可以从.root文件中读取我的TH2D图形
我现在想通过matplotlib或seaborn重新创建和重新绘制现有图形,但是我不了解导入的TH2的结构。 myTH2D._members()
正确输出:
['fName',
'fTitle',
'fLineColor',
'fLineStyle',
'fLineWidth',
'fFillColor',
'fFillStyle',
'fMarkerColor',
'fMarkerStyle',
'fMarkerSize',
'fNcells',
'fXaxis',
'fYaxis',
'fZaxis',
'fBarOffset',
'fBarWidth',
'fEntries',
'fTsumw',
'fTsumw2',
'fTsumwx',
'fTsumwx2',
'fMaximum',
'fMinimum',
'fNormFactor',
'fContour',
'fSumw2',
'fOption',
'fFunctions',
'fBufferSize',
'fBuffer',
'fBinStatErrOpt',
'fScalefactor',
'fTsumwy',
'fTsumwy2',
'fTsumwxy']
myTH2D.edges
输出右轴,myTH2D.values
输出右计数(已通过plt.imshow(myTH2D.values)进行了确认。问题在我调用myTH2D.pandas()
count variance
tof1 [ns] tof2 [ns]
[-inf, 4500.0) [-inf, 4500.0) 0.0 0.0
[4500.0, 4507.142857142857) 0.0 0.0
[4507.142857142857, 4514.285714285715) 0.0 0.0
[4514.285714285715, 4521.428571428572) 0.0 0.0
[4521.428571428572, 4528.571428571428) 0.0 0.0
... ... ... ...
[7500.0, inf) [6971.428571428572, 6978.571428571429) 0.0 0.0
[6978.571428571429, 6985.714285714286) 0.0 0.0
[6985.714285714286, 6992.857142857143) 0.0 0.0
[6992.857142857143, 7000.0) 0.0 0.0
[7000.0, inf) 0.0 0.0
123904 rows × 2 columns
并且用myTH2D.numpy()
创建的ntuple以我不了解的方式嵌套:
(array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
[(array([4500. , 4508.57142857, 4517.14285714, 4525.71428571,
4534.28571429, 4542.85714286, 4551.42857143, 4560. ,
...,
7414.28571429, 7422.85714286, 7431.42857143, 7440. ,
7448.57142857, 7457.14285714, 7465.71428571, 7474.28571429,
7482.85714286, 7491.42857143, 7500. ]),
array([4500. , 4507.14285714, 4514.28571429, 4521.42857143,
4528.57142857, 4535.71428571, 4542.85714286, 4550. ,
...,
6957.14285714, 6964.28571429, 6971.42857143, 6978.57142857,
6985.71428571, 6992.85714286, 7000. ]))])
您对如何处理这些元组有任何建议吗?
谢谢!
编辑:
使用以下语法,我几乎可以实现正确的绘图。与原始版本相比,它是翻转的:
plt.pcolormesh(myTH2D[1][0][0],myTH2D[1][0][1],myTH2D[0])
尽管如此,我的问题仍然存在:我想通过熊猫处理数据,因此要加上标签:现在我不知道哪个是x轴,哪个是y轴。有什么想法吗?
答案 0 :(得分:1)
uproot3理解numpy.histogram。因此,您可以这样做:
import uproot3 as uproot
import numpy as np
x = np.random.normal(size=10000)
y = np.random.normal(size=10000)
f = uproot.recreate('example.root', compression=uproot.ZLIB(4))
f["h"] = np.histogram2d(x, y, 80)
f.close()
您现在应该在example.root中有一个名为TH2F
的{{1}}
答案 1 :(得分:0)
从边缘和垃圾箱计数(myTH2D.numpy()
)的数组中,您可以使用以下任何一种技术在Matplotlib中对其进行绘制:
Python: Creating a 2D histogram from a numpy matrix
您提到了Seaborn,但我对此不太熟悉。当然,它具有类似的功能。
在最前沿,您可以安装uproot4
和hist>=2.0.0
(以获取历史记录的预发行版),然后只需
myTH2D.to_hist().plot()
hist库的目标是成为直方图的一站式商店,并且接近其第一个非预发布版本。 (该系列从2.0.0开始,因为它接管了一个不再更新的项目的名称。“ hist”在名称上通常会丢失!)
Uproot 4代码库几乎可以替换当前的Uproot;它需要文档和文件写入功能。该接口与解决Uproot 3的接口问题(例如字符串vs字节字符串)略有不同,因此这就是为什么将其作为具有临时不同库名的逐步过渡来处理,而不是一次全部更改的原因。但是,如果您只是刚入门,则可能要从新库开始,这样就不必在不久的将来(今年秋天)习惯更改。