Python matplotlib ограничивается целочисленными отметками [дубликаты]

This question already has an answer here:

How to force the Y axis to only use integers in Matplotlib? 3 answers

Довольно часто я хочу сделать гистограмму. Если счет низкий, я часто получаю основные и / или второстепенные места для отметок, которые не являются целыми числами. Как я могу предотвратить это? Не имеет смысла ставить отметку в 1,5, когда данные считаются.

Это моя первая попытка:

import pylab
pylab.figure()
ax = pylab.subplot(2, 2, 1)
pylab.bar(range(1,4), range(1,4), align='center')
major_tick_locs = ax.yaxis.get_majorticklocs()
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1))
minor_tick_locs = ax.yaxis.get_minorticklocs()
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1:
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1))

который работает хорошо, когда счетчик небольшой, но когда он большой, я получаю много мелких тиков:

import pylab
ax = pylab.subplot(2, 2, 2)
pylab.bar(range(1,4), range(100,400,100), align='center')
major_tick_locs = ax.yaxis.get_majorticklocs()
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1))
minor_tick_locs = ax.yaxis.get_minorticklocs()
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1:
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1))

Как я могу получить желаемое поведение из первого примера с небольшим количеством, избегая того, что происходит во втором?

 John15 нояб. 2018 г., 23:13
Не является ли дублирующий вопрос тем, который задают позже? Похоже, он неправильно помечен как дубликат!
 John24 нояб. 2017 г., 11:04
Это неправильно помечено как дубликат. Это было задано перед другим вопросом. Другой вопрос должен быть отмечен как дубликат.

Ответы на вопрос(3)

что получается, что я могу просто игнорировать мелкие галочки. Я собираюсь попробовать и посмотреть, стоит ли оно во всех случаях использования:

def ticks_restrict_to_integer(axis):
    """Restrict the ticks on the given axis to be at least integer,
    that is no half ticks at 1.5 for example.
    """
    from matplotlib.ticker import MultipleLocator
    major_tick_locs = axis.get_majorticklocs()
    if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
        axis.set_major_locator(MultipleLocator(1))

def _test_restrict_to_integer():
    pylab.figure()
    ax = pylab.subplot(1, 2, 1)
    pylab.bar(range(1,4), range(1,4), align='center')
    ticks_restrict_to_integer(ax.xaxis)
    ticks_restrict_to_integer(ax.yaxis)

    ax = pylab.subplot(1, 2, 2)
    pylab.bar(range(1,4), range(100,400,100), align='center')
    ticks_restrict_to_integer(ax.xaxis)
    ticks_restrict_to_integer(ax.yaxis)

_test_restrict_to_integer()
pylab.show()
Решение Вопроса

MaxNLocator метод, вот так:

    from pylab import MaxNLocator

    ya = axes.get_yaxis()
    ya.set_major_locator(MaxNLocator(integer=True))
 16 февр. 2016 г., 20:07
или если вы не импортируете pylab,matplotlib.ticker.MaxNLocator(), (отthis answer)
 28 апр. 2015 г., 20:03
я полагаю, чтоpylab.MaxNLocator() это лучшая запись.
 pylab.bar(range(1,4), range(1,4), align='center')  

а также

 xticks(range(1,40),range(1,40))

работал в моем коде. Просто используйтеalign необязательный параметр иxticks делает волшебство.

 John22 авг. 2012 г., 15:27
Разве этот метод не дает слишком много тиков для больших диапазонов?

Ваш ответ на вопрос