Изменение "частоты тиков" на оси 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?

9 ответов


вы можете явно установить, где вы хотите поставить галочки с 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


другой подход-установить локатор оси:

import matplotlib.ticker as plticker

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

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


мне нравится это решение (от 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(), позволяет автоматическое определение предела, и легко для чтения более поздно.


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

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

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

самый чистый способ скрыть каждую метку 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)

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

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)

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

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

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


Я разработал неэлегантное решение. Рассмотрим, что у нас есть ось 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()

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

plt.xticks(xmarks)

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

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

length = 5

вот чистая реализация 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()