зменшення кількості ділянок кліщів


160

У мене на графіку занадто багато кліщів, і вони стикаються один з одним.

Як можна зменшити кількість кліщів?

Наприклад, у мене є кліщі:

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

І я хочу лише:

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

Я намагався грати з LogLocator, але мені не вдалося це зрозуміти.

Відповіді:


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)

27
Це було чудовою пропозицією, також можна було конкретизувати pyplot.locator_params(axis = 'x', nbins = 4)(або axis = 'y') зробити процес дійсно простим. Дякую @bgamari!
Бенджамінгрос

8
З numticksnbins
логічною

1
@bgamari, не могли б ви додати numticksрішення для логарифмічних сюжетів, як вказувало @meduz?
Løiten

7
Це, мабуть, не розміщує мітки там, де вони повинні бути. Наприклад, якщо оригінальні ярлики є, [0, 1, ..., 99]а тепер один набір nticks=10, то нові розріджені мітки розміщуватимуться в десять разів довше, крім осі, тобто тепер 1будуть сидіти там, де 9було, 2де 19було ... і 9де 99було.
Вім

2
Перевірте результати, перш ніж довіряти цьому методу. @Vim правильний. Значення галочок будуть розміщені неправильно.
Девід Дж.

53

Якщо хтось все-таки отримує цю сторінку в результатах пошуку:

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)

7
Це насправді спрацювало проти всіх інших відповідей, які нічого не зробили. дякую :)
Faizan

Молодці. Мені знадобилося деякий час, щоб знайти це, але це зробило те, що я хотів.
Іван

Дякую, це гарантує, що те, що залишається на етикетках, знаходиться у правильних положеннях. Додатковим кроком, який би покращив цю відповідь, є також зняття галочки.
Девід Дж.

Чудова проста відповідь - здивований, що не відомий користувачеві SO метод. Це було б цінним доповненням до lib?
jabberwocky

32

Щоб вирішити питання щодо налаштування та появи кліщів, дивіться посібник з локаторів тиків на веб-сайті matplotlib

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

Установив би загальну кількість кліщів по осі x 3 і рівномірно розподілив її по осі.

Про це також є хороший підручник


Виберіть лише перші 3 індексу часу. коли отримують сокиру від pandas.DataFrame.plot ax = df.plot()
Mithril

@Mithril Вибачте, я не дуже розумію ваш коментар. Чи можете ви, будь ласка, докладно?
Прагет Джаятісса

Якщо у мене є df ( pandas.DataFrame) з індексом дати [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].
Mithril

1
@Mithril, df.plot()часто відображається minor_locator, тому ви можете спробувати ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Також не забудьте замінити 3кількість кліщів, які ви хочете відобразити. Для панд таймсерій я рекомендую import matplotlib.dates as mdatesі працювати ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))зax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

Існує set_ticks()функція для об'єктів осі.


4
Це спрацювало б, якби я заздалегідь знав, які кліщі я хочу. Приклад, який я наводив вище, був лише прикладом. Я не знаю, що таке кліщі, я просто знаю, що хочу їх менше, тобто кожного іншого.
jlconlin

10
Ви можете зателефонувати get_xticks()або get_yticks()спочатку для об'єкта осей, відредагувати за потребою, а потім передати список назад до set_ticks().
користувач812786

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.
Давід Лашук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.