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

15

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

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

Это неправильно помечено как дубликат. Это было задано перед другим вопросом. Другой вопрос должен быть отмечен как дубликат. John
Не является ли дублирующий вопрос тем, который задают позже? Похоже, он неправильно помечен как дубликат! John

Ваш Ответ

3   ответа
25

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

    from pylab import MaxNLocator

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

а также

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

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

Разве этот метод не дает слишком много тиков для больших диапазонов? John
0

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

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

Похожие вопросы