Put value at centre of bins for histogram

10,726

To get 24 bins, you need 25 values in your sequence defining bin edges. There are always n+1 edges for n bins.

So, alter your line

plt.hist(hour_list,bins=np.arange(24)-0.5)

to

plt.hist(hour_list,bins=np.arange(25)-0.5)

Note - your test data should have both edge cases in it. If you are simply extracting hours by rounding, there should be some 0 values in the list.


Full example:

import matplotlib.pyplot as plt
import numpy as np

def plot_my_time_based_histogram():
    #Note - changed the 24 values for 0
    time_new=[9, 23, 19, 9, 1, 2, 19, 5, 4, 20, 23, 10, 20, 5, 21, 17, 4, 13, 8, 13, 6, 19, 9, 14, 9, 10, 23, 19, 23, 20, 19, 6, 5, 0, 20, 19, 15, 14, 19, 14, 15, 21]
    fig, ax = plt.subplots()
    hour_list = time_new
    print hour_list
    numbers=[x for x in xrange(0,24)]
    labels=map(lambda x: str(x), numbers)
    plt.xticks(numbers, labels)
    #Make limit slightly lower to accommodate width of 0:00 bar
    plt.xlim(-0.5,24)
    plt.hist(hour_list,bins=np.arange(25)-0.5)

    # Further to comments, OP wants arbitrary labels too.
    labels=[str(t)+':00' for t in range(24)]
    ax.set_xticklabels(labels)
    plt.show()

plot_my_time_based_histogram()

Result:

histogram with centred bins

Share:
10,726
Abhishek Bhatia
Author by

Abhishek Bhatia

"The purpose of computing is insight, not numbers."- Richard Hamming, 1961 Abhishek has had a unique interdisciplinary research exposure to AI systems. His projects range from designing artificially intelligent autonomous systems that operate in varied setups, all the way to studying common emergent phenomena in natural systems. He has published 5 research papers in the field of complex systems, artificial intelligence and statistical inference. He is currently working on Deep Reinforcement Learning applications for Natural Language Processing and General-game Playing. He is also enthusiastic about open-source tools and frequently contributes to many open-source projects.

Updated on June 23, 2022

Comments

  • Abhishek Bhatia
    Abhishek Bhatia almost 2 years

    I have the following code to plot a histogram. The values in time_new are the hours when something occurred.

        time_new=[9, 23, 19, 9, 1, 2, 19, 5, 4, 20, 23, 10, 20, 5, 21, 17, 4, 13, 8, 13, 6, 19, 9, 14, 9, 10, 23, 19, 23, 20, 19, 6, 5, 24, 20, 19, 15, 14, 19, 14, 15, 21]
    
        hour_list = time_new
        print hour_list
        numbers=[x for x in xrange(0,24)]
        labels=map(lambda x: str(x), numbers)
        plt.xticks(numbers, labels)
        plt.xlim(0,24)
        pdb.set_trace()
        plt.hist(hour_list,bins=24)
        plt.show()
    

    This produces a histogram, but the bins are not aligned as I would like. I want the hour to be in the centre of the bin, not on the edge.

    Histogram of time_new with default bins

    I referred to this question / answer, but it seems not to answer the question either.

    I tried the following code for the histogram plot instead, but it didn't plot a bar for the value 23

    plt.hist(hour_list, bins=np.arange(24)-0.5)
    

    histogram with bin range specified

    Can anyone help me to get 24 bins, with the hour at the centre of each?