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

拜拜、爱过 提交于 2019-12-29 01:38:09

问题


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')

回答1:


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()

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.




回答2:


If it's just the yaxis you want to change, an easy way is to determine which ticks you want:

tickpos = [0,1,4,6]

py.yticks(tickpos,tickpos)

will put ticks at 0, 1, 4, and 6. More generally

py.yticks([0,1,2,3], ['zero', 1, 'two', 3.0])

will put the label of the second list at the location in the first list. If the label is going to be the yvalue, it's a good idea to use the py.yticks(tickpos,tickpos) version just to make sure that whenever you change the locations of the ticks, the labels get the same change.

More generally though, Kington's answer will let you tell pylab just integers for the y axis, but let it choose where the ticks go.




回答3:


You can modify tick labels/numbers as follows. This is example only, as you have not provided any code that you have, so not sure if it applys to you or not.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

fig.canvas.draw()

# just the original labels/numbers and modify them, e.g. multiply by 100
# and define new format for them.
labels = ["{:0.0f}".format(float(item.get_text())*100) 
                for item in ax.get_xticklabels()]


ax.set_xticklabels(labels)

plt.show()

Without modification of x axis:

WIth the modification:



来源:https://stackoverflow.com/questions/27496737/how-to-force-matplotlib-to-display-only-whole-numbers-on-the-y-axis

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!