Search code examples
pythondata-visualizationmatplotlib

Matplotlib digit grouping (decimal separator)


Basically, when generating plots with matplotlib, The scale on the y-axis goes into the millions. How do I turn on digit grouping (i.e. so that 1000000 displays as 1,000,000) or turn on the decimal separator?


Solution

  • I don't think there's a built-in function to do this. (That's what i thought after i read your Q; i just checked and couldn't find one in the Documentation).

    In any event, it's easy to roll your own.

    (Below is a complete example--ie, it will generate an mpl plot with one axis having commified tick labels--although five lines of code are all you need to create custom tick labels--three (including import statement) for the function used to create the custom labels, and two lines to create the new labels and place them on the specified axis.)

    # first code a function to generate the axis labels you want 
    # ie, turn numbers greater than 1000 into commified strings (12549 => 12,549)
    
    import locale
    locale.setlocale(locale.LC_ALL, 'en_US')
    fnx = lambda x : locale.format("%d", x, grouping=True)
    
    from matplotlib import pyplot as PLT
    import numpy as NP
    
    data = NP.random.randint(15000, 85000, 50).reshape(25, 2)
    x, y = data[:,0], data[:,1]
    
    fig = PLT.figure()
    ax1 = fig.add_subplot(111)
    ax1.plot(x, y, "ro")
    default_xtick = range(20000, 100000, 10000)
    
    # these two lines are the crux:
    # create the custom tick labels
    new_xtick = map(fnx, default_xtick)
    # set those labels on the axis
    ax1.set_xticklabels(new_xtick)
    
    PLT.show()