Здравствуйте и спасибо заранее. Я начинаю с 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](https://i.stack.imgur.com/UCYYV.png)