Как подписать оси в matplotlib
Перейти к содержимому

Как подписать оси в matplotlib

  • автор:

Как подписать оси на графике в Matplotlib Pyplot

Подскажите пожалуйста как подписать оси на графике построенном в библиотеке Matplotlib pyplot если оси выровнены по центру. Вот мой код:

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position("center") ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue') ax.set_ylabel("Y", fontsize=15, color='orange') plt.show() 

вот я выставил оси, но они выставились очень криво( Может есть какой-то атрибут выравнивания?

Отслеживать
25.7k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 22 сен 2020 в 19:12
111 4 4 серебряных знака 10 10 бронзовых знаков
Вот я выставил оси, но они почему-то выставились криво((( Может есть какие-то атрибуты выравнивания?
22 сен 2020 в 19:15
что именно у вас выставилось криво?
22 сен 2020 в 19:21

@strawdog ну видите на картинке синий X и оранжевый игрек. Хотелось бы чтобы они было в другом виде. Ну как всегда мы графики подписываем

22 сен 2020 в 19:37

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Попробуйте добавить labelpad

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue', labelpad=120) # + ax.set_ylabel("Y", fontsize=15, color='orange', labelpad=140) # + ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') plt.show() 

введите сюда описание изображения

А случайно не знаете, игрек можно перевернуть или тут уже всё?

Попробуйте добавить rotation

import matplotlib.pyplot as plt import numpy as np a = 0.04 y = lambda x: a * np.sin(x) fig = plt.subplots() plt.title("First graphic: 0.04 * sin(x)") x = np.linspace(-10, 10, 100) plt.plot(x, y(x), "r-") ax = plt.gca() ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_xlabel("X", fontsize=15, color='blue', labelpad=120) # + ax.set_ylabel("Y", fontsize=15, color='orange', labelpad=140, rotation=0) # + ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') plt.show() 

Как подписать дату и время на оси абсцисс в Matplotlib?

Какие опции мне нужно указать в Matplotlib, чтобы ось абсцисс с датой-временем отображалась следующим образом?

----|----*----*----*----|----*----*----*----|----*----*----*---> | 6 12 18 | 6 12 18 | 6 12 18 14.06.2022 15.06.2022 16.06.2022
  • Вопрос задан более года назад
  • 175 просмотров

1 комментарий

Простой 1 комментарий

Viktor_T2

Массив разделить на 2 дни и часы
затем
ax2 = ax1.twiny()
https://stackoverflow.com/questions/10514315/how-t.
затем сдвигаем вниз
# Move twinned axis ticks and label from top to bottom
ax2.xaxis.set_ticks_position(«bottom»)
ax2.xaxis.set_label_position(«bottom»)
https://stackoverflow.com/questions/31803817/how-t.
Как-то так

Решения вопроса 0
Ответы на вопрос 1
Ну, например, вот так:

import pandas as pd import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator ds=[ ['14.06.2022 00:00', 1], ['14.06.2022 06:00', 2], ['14.06.2022 12:00', 3], ['14.06.2022 18:00', 4], ['15.06.2022 00:00', 1], ['15.06.2022 06:00', 2], ['15.06.2022 12:00', 3], ['15.06.2022 18:00', 4], ['16.06.2022 00:00', 1], ['16.06.2022 06:00', 2], ['16.06.2022 12:00', 3], ['16.06.2022 18:00', 4] ] df=pd.DataFrame(ds,columns=['D','A']) df['D']=pd.to_datetime(df['D']) df.set_index('D',inplace=True) ax=df.plot() ax.xaxis.set_minor_locator(MultipleLocator(6))

62a8787e919cc437718429.png

Ответ написан более года назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +2 ещё

У кого есть готовый код inline callback кнопки на vkbottle?

  • 1 подписчик
  • 14 минут назад
  • 15 просмотров

Настраиваем формат отображения меток у координатных осей

Помимо управления расположения меток на координатных осях можно также задавать формат вывода информации. Для этого используются различные форматеры. Но, прежде чем мы перейдем к их рассмотрению, отмечу две довольно распространенные на практике функции:

с помощью которых часто делают сокрытие текстовых меток для тиков графика:

import numpy as np import matplotlib.pyplot as plt fig = plt.figure(figsize=(7, 4)) ax = fig.add_subplot() x = np.arange(-np.pi/2, np.pi, 0.1) ax.plot(x, np.sin(x)) ax.set_xticklabels([]) ax.set_yticklabels([]) ax.grid() plt.show()

Если же требуется более тонкая настройка формата тиков, то для этого в matplotlib используется функция set_major_formatter(), которая применяет тот или иной форматер для форматирования текстовой информации у соответствующих координатных осей.

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

И на этом занятии мы рассмотрим основные из них.

NullFormatter

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

from matplotlib.ticker import NullFormatter

А, затем, применить к оси абсцисс или ординат:

ax.xaxis.set_major_formatter(NullFormatter())

Мы здесь сначала обращаемся к объекту xaxis, отвечающий за ось Ox, и вызываем функцию set_major_formatter(), передавая ей экземпляр класса NullFormatter. В результате, подписи у этой оси исчезают и мы видим следующий результат:

По аналогии, можно работать и с осью ординат, только для этого следует использовать объект yaxis:

ax.yaxis.set_major_formatter(NullFormatter())

Увидим похожий результат, но уже для оси Oy.

FormatStrFormatter

Следующий класс FormatStrFormatter позволяет устанавливать формат числовых данных подписей рисок. Для этого в конструктор данного класса передается спецификатор числа нужного формата, например, запись вида:

ax.yaxis.set_major_formatter(FormatStrFormatter('%d'))

будет округлять все числа до целых и по оси Oy мы увидим следующее:

Если же указать спецификатор в виде:

ax.yaxis.set_major_formatter(FormatStrFormatter('%f'))

то получим вещественные числа с шестью знаками после запятой. Для управления точностью вещественных чисел используется запись вида:

ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))

В данном случае мы ограничиваемся двумя цифрами после запятой, то есть, округляем все до сотых. Результат будет следующим:

Интересно, что здесь можно формировать любую строку заданного формата, например, добавлять надписи:

ax.yaxis.set_major_formatter(FormatStrFormatter('y = %.2f'))

В итоге, перед каждым числом будет записано «y = ».

FuncFormatter

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

Для этого воспользуемся классом FuncFormatter и передадим ему ссылку на функцию formatOy:

ax.yaxis.set_major_formatter(FuncFormatter(formatOy))

Сама же функция будет выглядеть так:

def formatOy(x, pos): return f"[]" if x  0 else f"()"

Здесь x – это текущее значение риски; pos – текущая позиция (номер) риски от 0 до N, где N+1 – общее число рисок.

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

ScalarFormatter

Этот форматер используется пакетом matplotlib по умолчанию. Он отображает числовые данные так, как они есть с небольшими манипуляциями. Если число оказывается очень большим (больше 10^10), то его множитель выносится:

То же самое происходит и с очень маленькими числами (меньше 10^-10). Но мы можем изменить это поведение и настроить свой диапазон больших и малых значений. Например, если вывести график в диапазоне степени 10^5:

fig = plt.figure(figsize=(7, 4)) ax = fig.add_subplot() x = np.arange(-2*np.pi, 2*np.pi, 0.1) ax.plot(x, np.sinc(x) * 1e5) ax.grid() plt.show()

То числа будут отображены целиком без сокращений. Но, если сформировать ScalarFormatter и указать максимальную и минимальную степень 4:

sf = ScalarFormatter() sf.set_powerlimits((-4, 4)) ax.yaxis.set_major_formatter(sf)

то результат будет следующий:

Как видите, степень 10^5 была вынесена за скобки.

Если мы хотим настроить такое поведение глобально для всех графиков, то можно воспользоваться словарем rcParams и переопределить ключ axes.formatter.limits:

matplotlib.rcParams["axes.formatter.limits"] = (-4, 4)

FixedFormatter

Если каждой риске оси нужно присвоить строго определенное значение, то для этого хорошо подходит класс FixedFormatter. Работает он очень просто. Его конструктору передается список значений, которые, затем, будут подставлены соответствующим рискам. Например:

ax.xaxis.set_major_locator(FixedLocator([-3, -2, -1, 0, 1, 2, 3])) ax.xaxis.set_major_formatter(FixedFormatter(['a', 'b', 'c', 'd', 'e', 'f', 'g']))

Причем, обратите внимание, мы использовали класс FixedFormatter совместно с классом FixedLocator, так как желательно, чтобы списки по длинам в этих классах совпадали.

Мы с вами рассмотрели лишь некоторые популярные классы форматеров, полный их список можно найти на странице официальной документации:

Видео по теме

#1. Установка пакета и основные возможности

#2. Функция plot для построения и оформления двумерных графиков

#3. Отображение нескольких координатных осей в одном окне

#4. Граничные значения осей и локаторы для расположения меток на них

#5. Настраиваем формат отображения меток у координатных осей

#6. Делаем логарифмический масштаб у координатных осей

#7. Размещаем стандартные текстовые элементы на графике

#8. Добавляем легенду и рисуем геометрические фигуры на графиках

#9. Рисуем ступенчатые, стековые, stem и точечные графики

#10. Рисуем гистограммы, столбчатые и круговые диаграммы

#11. Показ изображений и цветовых сеток

#12. Как строить трехмерные графики

#13. Рисуем линии уровня функциями contour, contourf и tricontour, tricontourf

#14. Создаем анимацию графиков Классы FuncAnimation и ArtistAnimation

© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Размещаем стандартные текстовые элементы на графике

На одном из прошлых занятий мы увидели, как можно строить двумерные линейные графики с помощью функции plot() и задавать различные стили его отображения: цвет, тип, толщину линии. На этом занятии продолжим тему оформления графиков и начнем с сетки. Как мы уже говорили, в самом простом случае достаточно вызвать команду grid():

import numpy as np import matplotlib.pyplot as plt y = np.arange(0, 5, 1) x = np.array([a*a for a in y]) y2 = [0, 2, 3, 4, 5, 7] x2 = [i+1 for i in y2] lines = plt.plot(x, y, x2, y2) plt.grid() plt.show()

И сетка появится сформируется в текущих координатных осях:

Причем, ее размеры будут автоматически подстраиваться под размер осей (объекта Axes).

Помимо обычной крупной сетки (major grid) можно наложить более мелкую (minor grid) минорную сетку. Для этого сначала нужно включить режим отображения минорной сетки:

plt.minorticks_on()

А, затем, в функции grid() прописать два типа сеток (мажорную и минорную):

plt.grid(which='major', color = '#444', linewidth = 1) plt.grid(which='minor', color='#aaa', ls=':')

В результате, график приобретет вид:

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

Создание надписей и подписей

  • title – заголовок для осей;
  • xlabel, ylabel – подписи для каждой из осей;
  • text – произвольная текстовая информация в области осей;
  • annotate – аннотация (текст с указателем).
  • subtitle – заголовок для фигуры (окна);
  • figtext – размещение произвольной текстовой информации в области окна.
fig = plt.figure(figsize=(7, 4)) ax = fig.add_subplot() plt.figtext(0.05, 0.6, 'Текст в области окна') fig.suptitle('Заголовок окна') ax.set_xlabel('Ox') ax.set_ylabel('Oy') ax.text(0.05, 0.1, 'Произвольный текст в координатных осях') ax.annotate('Аннотация', xy=(0.2, 0.4), xytext=(0.6, 0.7), arrowprops={'facecolor': 'gray', 'shrink': 0.1}) plt.show()

Обратите внимание, если у нас используется всего одна координатная ось, то подписи для нее можно определить с помощью функций:

plt.xlabel('Ox') plt.ylabel('Oy')

Если же объектов Axes несколько, то эти функции будут относиться к последней активной оси.

Оформление текстовых элементов

Теперь перейдем к оформлению на уровне текстовых блоков. Как правило, все текстовые элементы в matplotlib – это объекты класса Text. И у них имеются стандартный набор свойств для их оформления. Полный их перечень можно посмотреть на странице официальной документации: https://matplotlib.org/stable/api/text_api.html Я же приведу наиболее употребительные:

Свойство Описание
alpha степень прозрачности (число в диапазоне [0; 1])
backgroundcolor цвет фона
color или c цвет текста
fontfamily или family тип шрифта
fontsize или size размер шрифта
fontstyle или style стиль шрифта:
fontweight или weight степень утолщения – число от 0 до 1000 или константы: ‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’
horizontalalignment или ha выравнивание по горизонтали:
label текст заголовка
position координаты текста (x, y)
rotation поворот текста: вещественное число [0; 1] или константы
verticalalignment или va выравнивание по вертикали:
visible отображение текста: True/False
x координата x – вещественное число [0; 1]
y координата y – вещественное число [0; 1]

Использовать эти свойства очень просто. Например, в функции figtext() пропишем именованный параметр fontsize:

plt.figtext(0.05, 0.6, 'Текст в области окна', fontsize=24)

Теперь текст отображается с новым размером шрифта. Или, можно еще указать цвет:

plt.figtext(0.05, 0.6, 'Текст в области окна', fontsize=24, color='r')

Получим текст размером 24 и красным цветом. По аналогии задаются все другие свойства. Также следует иметь в виду, что у каждого типа текстовых объектов имеются и свои дополнительные свойства. Подробно о них можно посмотреть в документации.

Параметр bbox

С помощью параметра bbox можно устанавливать дополнительные элементы оформления для текстовых блоков. Ему следует указать словарь, ключами которого являются аргументы класса FancyBboxPatch:

Свойство Описание
boxstyle вид рамки вокруг текста
alpha степень прозрачности фона
color цвет фона с рамкой
edgecolor или ec цвет рамки
facecolor или fc цвет заливки
fill использовать ли заливку: True/False
hatch тип штриховки:
linestyle или ls стиль линии границы:
linewidth или lw толщина рамки

В качестве параметра boxstyle можно выбирать следующие значения:

Атрибут Описание Вид
circle имеет параметр pad (отступ от границы)
darrow имеет параметр pad
larrow имеет параметр pad
rarrow имеет параметр pad
round имеет параметры: pad, rounding_size
roundtooth имеет параметры: pad, tooth_size
sawtooth имеет параметры: pad, tooth_size
square имеет параметр pad

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

ax.text(15, 2, 'Текст', bbox={'boxstyle':'darrow', 'facecolor': '#AAAAFF'}) ax.plot(np.arange(0, 5, 0.25))

Цвет фона фигуры и координатных осей

Используя параметр facecolor можно задавать цвет фона для всей формы и отдельно для координатных осей. Например, если при создании фигуры указать этот параметр в виде:

fig = plt.figure(figsize=(7, 4), facecolor='#eee')

то получим светло-серую заливку фона окна. Или, это можно сделать с помощью метода set() после создания фигуры:

fig.set(facecolor='#eee')

То же самое выполняется и для координатных осей, например, изменим цвет фона на светло-зеленый:

ax.set(facecolor='#AAFFAA')

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *