Как имитировать c розыгрыш ('тот же') из ROOT с помощью matplotlib - PullRequest
0 голосов
/ 12 марта 2020

У меня есть сценарий использования от ROOT, который я не смог воспроизвести с помощью matplotlib. Вот минимальный пример

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
dist1x = np.random.normal(5, 0.05, 10_000)  
dist1y = np.random.normal(5, 0.05, 10_000)
dist2x = np.random.normal(15, 0.05, 10_000)  
dist2y = np.random.normal(15, 0.05, 10_000)

ax.hist2d(dist1x, dist1y, bins=100, cmap='viridis')
ax.hist2d(dist2x, dist2y, bins=100, cmap='viridis')

plt.show()

, и результат будет

enter image description here

С ROOT можно сделать:

TCanvas *c1 = new TCanvas("c1","c1");

TH1D *h1 = new TH1D("h1","h1",500,-5,5);
h1->FillRandom("gaus");

TH1D *h2 = new TH1D("h2","h2",500,-5,5);
h2->FillRandom("gaus");

h1->Draw();
h2->Draw("SAME");

и две гистограммы разделят холст, оси и т. Д. c. Почему при построении двух гистограмм на одном и том же рисунке показана только последняя? Как я могу воспроизвести поведение ROOT?

1 Ответ

1 голос
/ 13 марта 2020

Я думаю, что предполагаемое поведение - нарисовать сумму обеих гистограмм . Вы можете сделать это путем объединения массивов перед построением графика:

ax.hist2d(np.concatenate([dist1x, dist2x]),
          np.concatenate([dist1y, dist2y]),
          bins=100, cmap='viridis')

Matplotlib sum of histograms

(я немного изменил число, чтобы убедиться, что два перекрытия BLOB-объектов.)


Поведение по умолчанию в ROOT для SAME с TH2F, вероятно, нежелательно.

ROOT SAME

Вторая гистограмма рисуется над другой, перезаписывая цвет заливки ячеек. Информация из первой гистограммы отбрасывается в каждую ячейку, если во второй гистограмме есть хотя бы одно событие.

Чтобы воспроизвести это поведение, я бы предложил использовать numpy.histogram2d. Установите ячейки первой гистограммы на ноль, если есть записи во второй, а затем выведите сумму обоих.

bins = np.linspace(0, 20, 100), np.linspace(0, 20, 100)
hist1, _, _ = np.histogram2d(dist1x, dist1y, bins=bins)
hist2, _, _ = np.histogram2d(dist2x, dist2y, bins=bins)
hist1[hist2 > 0] = 0
sum_hist = hist1 + hist2
plt.pcolormesh(*bins, sum_hist)

Matplotlib


Если две гистограммы не имеют общего заполненного бина, эти два поведения идентичны.

...