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!
CodePudding user response:
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)