7

Изменение частоты делений по оси X или Y

1

Я пытаюсь настроить отображение данных в графиках на Python. У меня есть следующий код:

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

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

На оси X метки расположены с интервалом 5. Существует ли способ изменить их, чтобы они отображались с интервалом 1?

5 ответ(ов)

9

Вы можете явно задать, где вы хотите разместить деления по оси X с помощью функции 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 был использован вместо функции range из Python в случае, если min(x) и max(x) являются числами с плавающей запятой, а не целыми числами.)


Функция 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()
3

Другой подход заключается в установке местоположения осей (axis locator):

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0)  # этот локатор устанавливает деления на равных интервалах
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)  # этот локатор устанавливает деления на равных интервалах
ax.xaxis.set_major_locator(loc)

plt.show()

Этот код создает график с делениями по оси X, расположенными на равных интервалах, что может быть полезно для улучшения читаемости графика.

1

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

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

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

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

Также это легко сделать для вторичных делений:

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

Хотя это немного многословно, код остается достаточно компактным.

0

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

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Передайте ось, и я зафиксирую разрешение как требуется.
    """

    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)

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

gca().set_ylim(top=new_top) # например

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь