Изменение частоты "тика" на оси x или y в matplotlib?

Я пытаюсь установить, как python отображает мои данные.

Скажите

x = [0,5,9,10,15]

и

y = [0,1,2,3,4]

Тогда я бы сделал:

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

а галочки x-оси отображаются с интервалом 5. Есть ли способ сделать так, чтобы он показывал интервалы в 1?

Ответ 1

Вы можете явно указать, где вы хотите отметить отметки с помощью plt.xticks:

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

Например,

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

(np.arange использовался вместо функции Python range только в случае min(x) и max(x) - это float вместо ints.)


Функция plt.plot (или ax.plot) автоматически установит значения по умолчанию x и y. Если вы хотите сохранить эти ограничения и просто измените настройку меток, вы можете использовать ax.get_xlim(), чтобы узнать, какие ограничения уже установлены Matplotlib.

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

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

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

Вот пример:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()

Ответ 2

Другой подход заключается в установке локатора оси:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

Есть несколько различных типов локатора в зависимости от ваших потребностей.

Вот полный пример:

import matplotlib.pyplot as plt
import matplotlib.ticker as plticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

Ответ 3

Мне нравится это решение (из Поваренная книга по сборке Matplotlib):

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

Это решение дает вам четкое управление интервалом тика по номеру, указанному в ticker.MultipleLocater(), позволяет автоматически определять предельные значения и легко читать позже.

Ответ 4

Если кто-то заинтересован в общем однострочном пространстве, просто получите текущие тики и используйте его для установки новых тиков, сэмплируя все остальные галочки.

ax.set_xticks(ax.get_xticks()[::2])

Ответ 5

Это немного взломанный, но, безусловно, самый чистый/самый легкий для понимания пример, который я нашел для этого. Это из ответа на SO здесь:

Самый чистый способ скрыть каждую метку n-го тика в цветной панели matplotlib?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

Затем вы можете прокручивать метки, устанавливая их на видимые или не зависящие от плотности, которую вы хотите.

edit: обратите внимание, что иногда matplotlib устанавливает метки == '', поэтому может показаться, что метка отсутствует, а на самом деле она и ничего не отображает. Чтобы убедиться, что вы просматриваете фактические видимые метки, вы можете попробовать:

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

Ответ 6

Это старая тема, но я время от времени натыкаюсь на нее и выполняю эту функцию. Это очень удобно:

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

Одно из препятствий для контроля тиков, как это, заключается в том, что больше не нравится интерактивное автоматическое обновление макс. шкалы после добавленной строки. Тогда do

gca().set_ylim(top=new_top) # for example

и снова запустите функцию повторной настройки.

Ответ 7

Я разработал неэлегантное решение. Рассмотрим, что мы имеем ось X, а также список меток для каждой точки в X.

Пример:
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
Скажем, что я хочу показывать метки клещей только для "feb" и "jun",
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
Хорошо, теперь у нас есть поддельный список лейблов. Сначала мы построили оригинальную версию.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
Теперь изменилась версия.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

Ответ 8

xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

Это сработало для меня

если вы хотите, чтобы тики между [1,5] (1 и 5 включительно), затем замените

length = 5

Ответ 9

Здесь выполняется чистая реализация python желаемой функциональности, которая обрабатывает любые числовые ряды (int или float) с положительными, отрицательными или смешанными значениями:

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    import math as Math
    xMax, xMin = Math.ceil(max(x)), Math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

Пример вывода:

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

И пример использования:

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()