Построение 2D гистограммы с помощью rootpy и matplotlib
Я пытаюсь построить гистограмму ROOT 2D с rootpy и matplotlib.
Код, который я использую для этого:
from rootpy.io import File
from rootpy.plotting import Hist
import rootpy.plotting.root2matplotlib as rplt
import matplotlib.pyplot as plt
inputFile = File('mydata.root', 'read')
h_response = inputFile.myfolder.response
plt.figure(figsize=(16, 10), dpi=100)
rplt.hist(h_response, label='response matrix')
h_response.Draw()
plt.xlabel('reconstructed $E_{\mathrm{T}}^{miss}$')
plt.ylabel('Generated $E_{\mathrm{T}}^{miss}$')
plt.title('Response Matrix')
plt.savefig('ResponseMatrix.png')
Тем не менее, это оставляет меня с сообщением об ошибке:
Traceback (most recent call last):
File "/storage/Dropbox/Workspace/Analysis/DailyPythonScripts/src/unfolding.py", line 66, in <module>
rplt.hist(h_response, label='response matrix')
File "/usr/local/lib/python2.7/dist-packages/rootpy-0.7.0_a0-py2.7-linux-x86_64.egg/rootpy/plotting/root2matplotlib.py", line 140, in hist
snap_zero=snap_zero)
File "/usr/local/lib/python2.7/dist-packages/rootpy-0.7.0_a0-py2.7-linux-x86_64.egg/rootpy/plotting/root2matplotlib.py", line 82, in _set_bounds
ywidth = ymax - ymin
TypeError: unsupported operand type(s) for -: 'list' and 'list'
Очевидно, что я использую неправильный модуль rootpy2matplotlib, поэтому я посмотрел: модуль предоставляет функции: hist, bar и errorbar - не специфичные для>= 2D.
Я что-то пропустил? Есть ли легкий обходной путь?
PS: я бы хотел пометить этот вопрос тегом rootpy, но это невозможно. Поэтому я прошу прощения, так как этот вопрос является довольно конкретным.
2 ответа
Интерфейс rootpy root2matplotlib теперь предоставляет функции history2d, imshow и contour для построения гистограмм 2D ROOT. Смотрите пример здесь:
https://github.com/rootpy/rootpy/blob/master/examples/plotting/plot_matplotlib_hist2d.py
from matplotlib import pyplot as plt
from rootpy.plotting import root2matplotlib as rplt
from rootpy.plotting import Hist2D
import numpy as np
a = Hist2D(100, -3, 3, 100, 0, 6)
a.fill_array(np.random.multivariate_normal(
mean=(0, 3),
cov=np.arange(4).reshape(2, 2),
size=(1E6,)))
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3, figsize=(15, 5))
ax1.set_title('hist2d')
rplt.hist2d(a, axes=ax1)
ax2.set_title('imshow')
im = rplt.imshow(a, axes=ax2)
ax3.set_title('contour')
rplt.contour(a, axes=ax3)
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)
plt.show()
Я только что попробовал ваш скрипт на ROOT-файле, содержащем гистограмму TH2D. Все работало
/opt/rootpy # cat version.txt дает мне: 0.7.0
если я проверю свой
/usr/local/lib/python2.7/dist-packages/rootpy-dev-py2.7.egg/rootpy/plotting/root2matplotlib.py
и сравните его с сообщениями об ошибках, которые вы получаете, тогда похоже, что мы используем разные версии rootpy.
Попробуйте новейшую версию rootpy.