уменьшение количества сюжетных тиков

161

У меня слишком много тиков на графике, и они сталкиваются друг с другом.

Как я могу уменьшить количество тиков?

Например, у меня есть галочки:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

И я хочу только:

1E-5, 1E-3, ... 1E5, 1E7

Я пытался играть с LogLocator, но я не смог понять это.

jlconlin
источник

Ответы:

266

В качестве альтернативы, если вы хотите просто установить количество тиков, позволяя matplotlib позиционировать их (в настоящее время только с MaxNLocator), есть pyplot.locator_params,

pyplot.locator_params(nbins=4)

Вы можете указать конкретную ось в этом методе, как указано ниже, по умолчанию оба:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)
bgamari
источник
27
Это было отличное предложение, также возможность указать pyplot.locator_params(axis = 'x', nbins = 4)(или axis = 'y') сделать процесс действительно простым. Спасибо @bgamari!
Benjaminmgross
8
С лог-масштабом это работало numticksвместоnbins
meduz
1
@bgamari, не могли бы вы добавить numticksрешение для логарифмических графиков, как указано @meduz?
Løiten
7
Это, кажется, не помещает этикетки, где они должны быть. Например, если исходные метки тиков есть, [0, 1, ..., 99]а теперь они установлены nticks=10, то новые разреженные метки будут размещены в десять раз дальше друг от друга вдоль оси, то есть теперь 1будут располагаться там 9, 2где 19были , где были ... и 9где 99были.
Вим
2
Проверьте свои результаты, прежде чем доверять этому методу. @ Вим правильно. Значения галочки будут размещены неправильно.
Дэвид Дж.
55

Если кто-то все еще получает эту страницу в результатах поиска:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)
Katerina
источник
7
Это на самом деле работает против всех других ответов, которые ничего не сделали. спасибо :)
faizan
Отлично сработано. Мне понадобилось время, чтобы найти это, но он сделал то, что хотел.
Джон
Спасибо, это гарантирует, что оставшиеся ярлыки находятся в правильных позициях. Дополнительным шагом, который улучшит этот ответ, является также удаление отметки.
Дэвид Дж.
Отличный простой ответ - не удивлен ни один пользовательский метод, известный сообществу SO Это было бы ценным дополнением к lib?
Джаббервоки
32

Для того, чтобы решить вопрос о настройке и появления тиков см Tick Локаторы руководство на сайте Matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Устанавливает общее количество тиков на оси х на 3 и равномерно распределяет его по оси.

Есть также хороший учебник об этом

Пражет Джаятисса
источник
Выберите только первые 3 указателя даты и времени. когда получить топор от панд. DataFrame.plot ax = df.plot()
Mithril
@ Мифрил, извини, я не совсем понимаю твой комментарий. Не могли бы вы уточнить?
Прагет Джаятисса
Если у меня есть df ( pandas.DataFrame) с индексом datetime [2019-01-01, ... 2019-11-01], вызовите ax = df.plot(), верните объект рисунка. звонить ax.xaxis.set_major_locator(plt.MaxNLocator(3)) только показать первые 3 индекс [2019-01-01, 2019-01-02, 2019-01-03].
Мифрил
1
@ Мифрил, df.plot()часто отображает minor_locator, так что вы можете попробовать ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Также не забудьте заменить 3количество тиков, которое вы хотите отобразить. Для import matplotlib.dates as mdatesax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))ax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
серий времен
20

Есть set_ticks()функция для осевых объектов.

Андре Карон
источник
4
Это сработало бы, если бы я знал заранее, какие тики я хотел. Пример, который я привел выше, был только примером. Я не знаю, что такое галочки, я просто знаю, что хочу их меньше, т. Е. Всех остальных.
Jlconlin
10
Вы можете вызвать get_xticks()или get_yticks()сначала для объекта оси, отредактировать по мере необходимости, а затем передать список обратно set_ticks().
user812786
4
У меня нет set_ticks(), но у меня есть set_xticks()и set_yticks(). Это атрибуты объектов осей, а не осей. Может быть, это изменилось за последние пару лет.
Готье
2
Я не уверен, что мне следовало бы, некоторые люди сочли ваш ответ полезным, как есть, и только то, что он отличается для меня, не означает, что он предназначен для всех.
Готье
1
Пример может помочь сделать этот ответ полезным.
Ричард
10

на тот случай, если кому-то это все еще нужно, и, поскольку здесь у меня ничего не получалось, я придумал очень простой способ, который сохраняет вид сгенерированного графика «как есть», фиксируя число тиков точно равным N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))
Рафаэль
источник
2
Мне пришлось немного изменить последнюю строку, чтобы она возвращала значения как int, а не как float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje
@NickSettje все еще плывет со мной!
Мохд
4

Решение, которое дал @raphael, простое и довольно полезное.

Тем не менее, отображаемые метки тиков будут не значениями, взятыми из исходного распределения, а из индексов массива, возвращаемых np.linspace(ymin, ymax, N).

Для отображения значений N, равномерно распределенных по отношению к исходным меткам, используйте set_yticklabels()метод. Вот фрагмент для оси Y с целочисленными метками:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)
Тантрис
источник
Престижность за этот хороший твик!
Мохд
2

Когда используется логарифмическая шкала, число основных тиков можно исправить с помощью следующей команды

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Значение, установленное для, numticksопределяет количество отображаемых тиков оси.

Кредиты на пост @ bgamari для введения locator_params()функции, но nticksпараметр выдает ошибку при использовании масштаба журнала.

Эбе Исаак
источник
Вопрос и ответ для предыдущего matplotlib, т.е. 1, а вы имеете в виду 2.
Давид Ласзук