user3014593
user3014593

Reputation: 251

Get data points from a histogram in Python

I made a histogram of the 'cdf' (cumulative distribution) of a function. The histogram is basically No. of counts vs. luminosity. Now, how do I extract data points from a histogram? I need actual values of Luminosities. I am using Matplotlib in Python, and any online book, example, tutorial etc is not helping.

l= [ss.gammainccinv(aa+1, u[i]) for i in a] #is the cdf function
plt.hist(l, 50, histtype= 'step', align='mid') #is the histogram
plt.show()

I am not sure if I should align the bins to the edges or the mid point, but all I need is a list of l's.

Any suggestions would be greatly appreciated!

Upvotes: 23

Views: 67413

Answers (3)

Sarwan Ali
Sarwan Ali

Reputation: 169

if you want to get the assignments to bins, You can do it in the following way as explained here Which elements of list go into which histogram bins?

nbins=7
# Some example data
A = np.random.randint(0, 10, 10) 
B = np.random.rand(10)

counts, binEdges=np.histogram(A,bins=nbins)
>>> binEdges, np.digitize(A, binEdges)
array([ 0.        ,  1.28571429,  2.57142857,  3.85714286,  5.14285714,
    6.42857143,  7.71428571,  9.        ])

Upvotes: 1

Sinan Gok
Sinan Gok

Reputation: 189

You can also retrieve info from an already plotted histogram. For example:

x = np.random.rand(100)
plt.hist(x)

enter image description here

ax = plt.gca() # get axis handle

You can access to each individual bar using patches. Then .get_xy() will give you the x-y coordiate of a single bar (lower left corner), .get_width() will give width of the bar, and .get_height() will give the height of the bar (which is probably what you want).

p = ax.patches  # There are 10 patches
p[0].get_xy()
>> (0.011714084185001972, 0.0)
p[0].get_width()
>> 0.09871329223828645
p[0].get_height()
>> 8.0

So to retrieve all the heights:

heights = [patch.get_height() for patch in p]

And to reproduce the histogram:

plt.bar(range(len(heights)), heights)

enter image description here

Upvotes: 5

askewchan
askewchan

Reputation: 46530

You've already got a list of ls, so I'm not sure what you mean by that last statement, so maybe I've misinterpreted the question.

To get the values from a histogram, plt.hist returns them, so all you have to do is save them.

If you don't save them, the interpreter just prints the output:

In [34]: x = np.random.rand(100)

In [35]: plt.hist(x)
Out[35]: 
(array([ 11.,   9.,  10.,   6.,   8.,   8.,  10.,  10.,  11.,  17.]),
 array([ 0.00158591,  0.100731  ,  0.19987608,  0.29902116,  0.39816624,
        0.49731133,  0.59645641,  0.69560149,  0.79474657,  0.89389165,
        0.99303674]),
 <a list of 10 Patch objects>)

So, to save them, do:

counts, bins, bars = plt.hist(x)

Upvotes: 34

Related Questions