Python График 2d отношения со средневзвешенной линией тренда - PullRequest
0 голосов
/ 29 февраля 2020

Здравствуйте и спасибо заранее. Я начинаю с pandas фрейма данных и хотел бы построить двухмерный график с линией тренда, показывающей взвешенное среднее значение y с барами ошибок для неопределенности в среднем. Среднее значение должно быть взвешено на общее количество событий в каждом бине. Я начинаю с группировки df в «фотонную» группу и «общую» группу, где «фотон» является подмножеством общего. В каждом бине я рисую отношение фотонных событий к общему. На оси X и Y у меня есть две не связанные переменные "энергия кластера" и "энергия периметра". Моя попытка:

#make the 2d binning and total hist
energybins=[11,12,13,14,15,16,17,18,19,20,21,22]
ybins = [0,.125,.25,.5,.625,.75,1.,1.5,2.5]
total_hist,x,y,i = plt.hist2d(train['total_energy'].values,train['max_perimeter'].values,[energybins,ybins])
total_hist = np.array(total_hist)
#make the photon 2d hist with same bins
groups = train.groupby(['isPhoton'])
prompt_hist,x,y,i = plt.hist2d(groups.get_group(1)['total_energy'].values,groups.get_group(1)['max_perimeter'].values,bins=[energybins,ybins])
prompt_hist = np.array(prompt_hist)
ratio = np.divide(prompt_hist,total_hist,out=np.zeros_like(prompt_hist),where = total_hist!=0)
#plot the ratio
fig, ax = plt.subplots()
ratio=np.transpose(ratio)
p = ax.pcolormesh(ratio,)
for i in range(len(ratio)):
    for j in range(len(ratio[i])):
        text = ax.text(j+1, i+1, round(ratio[i, j], 2),ha="right", va="top", color="w")
ax.set_xticklabels(energybins)
ax.set_yticklabels(ybins)
plt.xlabel("Cluster Energy")
plt.ylabel("5x5 Perimeter Energy")
plt.title("Prompt Photon Fraction")

def myBinnedStat(x,v,bins):
    means,_,_ = stats.binned_statistic(x,v,'mean',bins)
    std,_ ,_= stats.binned_statistic(x,v,'std',bins)
    count,_,_ = stats.binned_statistic(x,v,'count',bins)
    return [ufloat(m,s/(c**(1./2))) for m,s,c in zip(means,std,count)]

Затем я могу построить график панели ошибок, но мне не удалось построить панель ошибок на той же оси, что и pcolorme sh. Я был в состоянии сделать это с Hist2D. Я не уверен, почему это так. Я чувствую, что есть более чистый способ сделать все это.

Это дает сюжет like

1 Ответ

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

pcolormesh отображает каждый элемент как единое целое на оси х. То есть, если вы построите 8 столбцов, эти данные будут охватывать 0-8 по оси x. Однако вы также переопределили метку оси x, так что 0-10 помечены как 11-21.

Для ваших панелей ошибок вы задали значения x в 11-21, или примерно так они и выглядят, где находятся данные построен Но не помечен, поскольку вы изменили метки, чтобы они соответствовали pcolorme sh.

. Это расхождение объясняет, почему ваши два графика не совпадают. Вместо этого вы можете использовать «x» значения по умолчанию для errorbar или определить значения x для pcolormesh. Например, используйте:

ax.errorbar(range(11), means[0:11], yerr=uncertainties[0:11])
...