Изменение частоты делений по оси X или Y
Я пытаюсь настроить отображение данных в графиках на 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 ответ(ов)
Вы можете явно задать, где вы хотите разместить деления по оси 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()
Другой подход заключается в установке местоположения осей (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, расположенными на равных интервалах, что может быть полезно для улучшения читаемости графика.
Если кого-то интересует общий однострочный способ, просто получите текущие такты и используйте их, чтобы установить новые такты, выбирая каждый второй:
ax.set_xticks(ax.get_xticks()[::2])
Если вы хотите просто установить расстояние между основными делениями, можно использовать одну строку с минимальным количеством шаблонного кода:
plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))
Также это легко сделать для вторичных делений:
plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))
Хотя это немного многословно, код остается достаточно компактным.
Это старая тема, но я время от времени сталкиваюсь с ней и написал вот такую функцию. Это очень удобно:
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.
Как задать размер шрифта заголовка фигуры и меток осей?
Как вынести легенду за пределы графика
Сохранить график в файл изображения вместо его отображения
Как сделать графики Matplotlib отображаемыми внутри IPython-ноутбука?
Как изменить размер шрифта на графике matplotlib