Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to force matplotlib to display only whole numbers on the Y axis [duplicate]

The data I am visualising only makes sense if it is whole numbers.

I.e. 0.2 of a record doesn't make sense in terms of the context of the information I am analysing.

How do I force matplotlib to only use whole numbers on the Y axis. I.e. 1, 100, 5 etc? not 0.1, 0.2 etc

for a in account_list:
    f = plt.figure()
    f.set_figheight(20)
    f.set_figwidth(20)
    f.sharex = True
    f.sharey=True

    left  = 0.125  # the left side of the subplots of the figure
    right = 0.9    # the right side of the subplots of the figure
    bottom = 0.1   # the bottom of the subplots of the figure
    top = 0.9      # the top of the subplots of the figure
    wspace = 0.2   # the amount of width reserved for blank space between subplots
    hspace = .8  # the amount of height reserved for white space between subplots
    subplots_adjust(left=left, right=right, bottom=bottom, top=top, wspace=wspace, hspace=hspace)

    count = 1
    for h in headings:
        sorted_data[sorted_data.account == a].ix[0:,['month_date',h]].plot(ax=f.add_subplot(7,3,count),legend=True,subplots=True,x='month_date',y=h)

        #set bottom Y axis limit to 0 and change number format to 1 dec place.
        axis_data = f.gca()
        axis_data.set_ylim(bottom=0.)
        from matplotlib.ticker import FormatStrFormatter
        axis_data.yaxis.set_major_formatter(FormatStrFormatter('%.0f'))

        #This was meant to set Y axis to integer???
        y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False)
        axis_data.yaxis.set_major_formatter(y_formatter)

        import matplotlib.patches as mpatches

        legend_name = mpatches.Patch(color='none', label=h)
        plt.xlabel("")
        ppl.legend(handles=[legend_name],bbox_to_anchor=(0.,1.2,1.0,.10), loc="center",ncol=2, mode="expand", borderaxespad=0.)
        count = count + 1
        savefig(a + '.png', bbox_inches='tight')
like image 447
yoshiserry Avatar asked Dec 16 '14 02:12

yoshiserry


People also ask

How do you limit the range of values on each of the axes in MatPlotLib?

To set the limits for X-axis only, We could use xlim() and set_xlim() methods. Similarly to set the limits for Y-axis, we could use ylim() and set_ylim() methods. We can also use axis() method which can control the range of both axes.

How do I change the Y axis range in MatPlotLib?

MatPlotLib with Python To change the range of X and Y axes, we can use xlim() and ylim() methods.

How do I show y axis values in MatPlotLib?

To specify the value of axes, create a list of characters. Use xticks and yticks method to specify the ticks on the axes with x and y ticks data points respectively. Plot the line using x and y, color=red, using plot() method. Make x and y margin 0.


1 Answers

The most flexible way is to specify integer=True to the default tick locator (MaxNLocator) do something similar to this:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig, ax = plt.subplots()

# Be sure to only pick integer tick locations.
for axis in [ax.xaxis, ax.yaxis]:
    axis.set_major_locator(ticker.MaxNLocator(integer=True))

# Plot anything (note the non-integer min-max values)...
x = np.linspace(-0.1, np.pi, 100)
ax.plot(0.5 * x, 22.8 * np.cos(3 * x), color='black')

# Just for appearance's sake
ax.margins(0.05)
ax.axis('tight')
fig.tight_layout()

plt.show()

enter image description here

Alternatively, you can manually set the tick locations/labels as Marcin and Joel suggest (or use a MultipleLocator). The downside to this is that you need to work out what tick positions make sense, rather than having matplotlib pick a reasonable integer tick interval based on the axis limits.

like image 120
Joe Kington Avatar answered Sep 22 '22 02:09

Joe Kington