Trying to input counts that are float values into histogram with set bins

Question:

I have this set of data here that I am trying to create a histogram for:

| cos_low | cos_up | E_low | E_up | diff_cross |
|-1       |-0.9    |105    |162.9 |21.7861     |
|-1       |-0.9    |162.9  |220.8 |41.0181     |
|-1       |-0.9    |220.8  |278.7 |38.4258     |
|-1       |-0.9    |278.7  |336.6 |23.33       |
|-1       |-0.9    |336.6  |394.5 |7.47169     |
|-1       |-0.9    |394.5  |452.4 |1.41047     |
|-1       |-0.9    |452.4  |510.3 |0.190604    |
|-1       |-0.9    |510.3  |568.2 |0.0381209   |
|-1       |-0.9    |568.2  |626.1 |0           |
|-1       |-0.9    |626.1  |684   |0           |

(There is no header in the original text file)

This is just a portion of the full set of data I have but the format is the same. It contains the bin edges for the angle and energy. The energy bin goes from 105 to 3000 with 50 bins. I am trying to put the diff_cross values as the counts for each energy bin into a histogram but I can’t get it to plot. I’ve tried the code for data that’s already been binned and counted from matplotlib’s histogram page, specifically:

counts, bins = np.histogram(x)
plt.stairs(bins, counts)

Perhaps I’m not using it correctly. I’ve also tried to look around to see if I could find a similar issue but I couldn’t really find one.
Here is the code for what I’ve tried:

import numpy as np
import sympy as smp
import matplotlib.pyplot as plt
import scipy as spy
import pandas as pd

#Reads text files containing data for each flux
flux_0 = pd.read_csv("2d_bins_flux_0.txt", sep=" ", header=None)

#Naming the columns
flux_0.columns = ['cos_low', ' ', 'cos_up', ' ', 'E_low', ' ', 'E_up', ' ', 
'diff_cross']

#Separating out data according to angles for each flux
flux_0_1 = flux_0.loc[lambda df: df['cos_low'] == -1, :] #Angle -1.0 < x < -0.9
flux_0_2 = flux_0.loc[lambda df: df['cos_low'] == -.9, :] #Angle -0.9 < x < -0.8

#This part is where the trouble starts
#I've tried some different things here, none working
counts = flux_0_1.diff_cross
bins = flux_0_1.E_low
plt.hist(bins[:-1], bins, weights=counts)

The histogram I’m trying to get is very similar to this one.
I might be missing some detail that’s preventing me from plotting this so I’ll continue playing around.
Much thanks in advance!

Asked By: PKimPhysics

||

Answers:

You could use plt.stairs with E_low as the edges and one E_up value from the last row as the last edge:

edges = list(flux_0_1.E_low) + [list(flux_0_1.E_up)[-1]]
plt.stairs(counts, edges)
Answered By: AndrzejO