Matplotlib. Урок 3.3. Настройка графиков. Текстовые элементы графика

Автор: | 30.09.2019

В этом уроке будут подробно рассмотрены текстовые элементы графика, такие как заголовок подложки и поля графика, подписи осей, текстовые блоки и аннотации.

Текстовые элементы графика

В части текстового наполнения при построении графика выделяют следующие составляющие:

  • заголовок поля (title);
  • заголовок фигуры (suptitle);
  • подписи осей (xlabel, ylabel);
  • тестовый блок на поле графика (text), либо на фигуре (figtext);
  • аннотация (annotate) – текст и указатель.

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

Ниже представлен код, отображающий все указанные выше текстовые элементы.

plt.figure(figsize=(10,4))

plt.figtext(0.5, -0.1, "figtext")
plt.suptitle("suptitle")

plt.subplot(121)
plt.title("title")
plt.xlabel("xlabel")
plt.ylabel("ylabel")
plt.text(0.2, 0.2, "text")
plt.annotate("annotate", xy=(0.2, 0.4), xytext=(0.6, 0.7),
            arrowprops=dict(facecolor='black', shrink=0.05))

plt.subplot(122)
plt.title("title")
plt.xlabel("xlabel")
plt.ylabel("ylabel")
plt.text(0.5, 0.5, "text")

Большую часть из представленные текстовых элементов мы рассмотрели в “Matplotlib. Урок 2. Работа с инструментом pyplot”, в этом уроке изучим их более подробно.

Элементы графика, которые содержат текст, имеют ряд настроечных параметров, которые в официальной документации определяются как **kwargs. Это свойства класса matplotlib.text.Text, используемые для управления представлением текста.

Заголовок фигуры и поля графика

Начнем с заголовка поля графика. Текст заголовка для поля устанавливается с помощью функции title(), которая имеет следующие основные аргументы:

  • label : str
    • Текст заголовка.
  • fontdict : dict
    • Словарь для управления отображением надписи, содержит следующие ключи:
      • ‘fontsize’: размер шрифта,
      • ‘fontweight’ : начертание ,
      • ‘verticalalignment’: вертикальное выравнивание,
      • ‘horizontalalignment’: горизонтальное выравнивание.
  • loc : {‘center’, ‘left’, ‘right’}, str, optional
    • Горизонтальное выравнивание.
  • pad : float 
    • Зазор между заголовком и верхней частью поля графика.

Функция title() также поддерживает в качестве аргументов свойства класса Text:

weight=['light', 'regular', 'bold']

plt.figure(figsize=(12, 4))

for i, lc in enumerate(['left', 'center', 'right']):
    plt.subplot(1, 3, i+1)
    plt.title(label=lc, loc=lc, fontsize=12+i*5, fontweight=weight[i], pad=10+i*15)

Заголовок фигуры задается с помощью функции suptitle(), аргументы этой функции аналогичны тем, что были рассмотрены для title()

Подписи осей графика

Если вы работаете с pyplot, то для установки подписей осей графика используются функции labelx() и labely(). При работе с объектом Axes для этих целей подходят функции set_xlabel() и set_ylabel().

Основные аргументы функций почти полностью совпадают с теми, что были описаны в функции title():

  • label : str
    • Текст подписи.
  • fontdict : dict
    • Словарь для управления отображением надписи, содержит следующие ключи:
      • ‘fontsize’: размер шрифта,
      • ‘fontweight’ : начертание ,
      • ‘verticalalignment’: вертикальное выравнивание,
      • ‘horizontalalignment’: горизонтальное выравнивание.
  • labelpad : float
    • Зазор между подписью и осью.

В самом простом случае достаточно передать только подпись в виде строки:

x = [i for i in range(10)]
y = [i*2 for i in range(10)]

plt.plot(x, y)
plt.xlabel("Ось X")
plt.ylabel("Ось Y")

Используемые некоторые из дополнительных свойств для настройки внешнего вида подписей осей:

plt.plot(x, y)
plt.xlabel("Ось X\nНезависимая величина", fontsize=14, fontweight="bold")
plt.ylabel("Ось Y\nЗависимая величина", fontsize=14, fontweight="bold")

Текстовый блок

За установку текстовых блоков на поле графика отвечает функция text(). Через основные параметры этой функции можно задать расположение, содержание и настройки шрифта:

  • x: float
    • Значение координаты x надписи.
  • y: float 
    • Значение координаты y надписи.
  • s: str
    • Текст надписи.

Для более тонкой настройки внешнего вида воспользуйтесь свойствами класса Text.

В простейшем варианте использование text() будет выглядеть так:

plt.text(0, 7, "HELLO!", fontsize=15)
plt.plot(range(0,10), range(0,10))

Использование свойств класса Text, позволяет значительно модифицировать это представление:

bbox_properties=dict(
    boxstyle="darrow, pad=0.3", 
    ec="k",
    fc="y",
    ls="-",
    lw=3   
)

plt.text(2, 7, "HELLO!", fontsize=15, bbox=bbox_properties)
plt.plot(range(0,10), range(0,10))

Аннотация

Инструмент Аннотация позволяет установить текстовый блок с заданным содержанием и стрелкой для конкретного места на графике. Аннотация – это мощный инструмент, остановимся на нем более подробно.

Для создания аннотации используется функция annotate(), основными ее аргументами являются:

  • text : str
    • Текст аннотации.
  • xy : (float, float)
    • Координаты места, на которое будет указывать стрелка.
  • xytext : (float, float), optional 
    • Координаты расположения текстовой надписи.
  • xycoords: str
    • Система координат, в которой определяется расположение указателя. 
  • textcoords: str 
    • Система координат, в которой определяется расположение текстового блока. 
  • arrowprops : dict, optional
    • Параметры отображения стрелки. Имена этих параметров (ключи словаря) являются параметрами конструктора объекта класса FancyArrowPatch.

Ниже представлен пример кода, который демонстрирует простой вариант использования annotation():

import math
x = list(range(-5, 6))
y = [i**2 for i in x]

plt.annotate('min', xy=(0, 0),  xycoords='data',
            xytext=(0, 10), textcoords='data',
            arrowprops=dict(facecolor='g'))
plt.plot(x, y)

Параметрам xycoords и textcoords может быть присвоено значение из следующей таблицы:

Значение Описание
‘figure points’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в точках.
‘figure pixels’ Начало координат – это нижний левый угол фигуры (0, 0). Координаты задаются в пикселях.
‘figure fraction’ Начало координат – это нижний левый угол фигуры (0, 0) при этом верхний правый угол – это точка (1, 1). Координаты задаются в долях от единицы.
‘axes points’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в точках.
‘axes pixels’ Начало координат – это нижний левый угол поля графика (0, 0). Координаты задаются в пикселях.
‘axes fraction’ Начало координат – это нижний левый угол поля графика (0, 0) при этом верхний правый угол поля – это точка (1, 1). Координаты задаются в долях от единицы.
‘data’ Тип координатной системы: декартова. Работа ведется в пространстве поля графика.
‘polar’ Тип координатной системы: полярная. Работа ведется в пространстве поля графика.

Рассмотрим настройку внешнего вида стрелки аннотации. За конфигурирование отображения стрелки отвечает параметр arrowprops, который принимает в качестве значения словарь, ключами которого являются параметры конструктора класса FancyArrowPatch, из них выделим два: arrowstyle, который отвечает за стиль стрелки и connectionstyle  – отвечает за стиль соединительной линии.

Стиль стрелки

Параметр: arrowstyle 

Тип:str, ArrowStyle, optional

Доступные стили стрелок представлены в таблице и на рисунке ниже.

Класс Имя Атрибуты
Curve None
CurveB -> head_length=0.4, head_width=0.2
BracketB -[ widthB=1.0, lengthB=0.2, angleB=None
CurveFilledB -|> head_length=0.4, head_width=0.2
CurveA <- head_length=0.4, head_width=0.2
CurveAB <-> head_length=0.4, head_width=0.2
CurveFilledA <|- head_length=0.4, head_width=0.2
CurveFilledAB <|-|> head_length=0.4, head_width=0.2
BracketA ]- widthA=1.0, lengthA=0.2, angleA=None
BracketAB ]-[ widthA=1.0, lengthA=0.2, angleA=None, widthB=1.0, lengthB=0.2, angleB=None
Fancy fancy head_length=0.4, head_width=0.4, tail_width=0.4
Simple simple head_length=0.5, head_width=0.5, tail_width=0.2
Wedge wedge tail_width=0.3, shrink_factor=0.5

Программный код для построения изображения:

plt.figure(figsize=(7,5))

arrows = ["-", "->", "-[", "|-|", "-|>", "<-", "<->", "<|-", "<|-|>", "fancy", "simple", "wedge"]

bbox_properties=dict(
    boxstyle="round,pad=0.2", 
    ec="k",
    fc="w",
    ls="-",
    lw=1   
)

ofs_x = 0
ofs_y = 0
for i, ar in enumerate(arrows):
    if i == 6: ofs_x = 0.5
    plt.annotate(ar, xy=(0.4+ofs_x, 0.92-ofs_y),  xycoords='data',
            xytext=(0.05+ofs_x, 0.9-ofs_y), textcoords='data', fontsize=17,
            bbox=bbox_properties,
            arrowprops=dict(arrowstyle=ar)
            )

    if ofs_y == 0.75: ofs_y = 0
    else: ofs_y += 0.15    
Стиль соединительной линии

Параметр: connectionstyle 

Тип:str, ConnectionStyle, or None, optional

Через данный параметр можно задать описание стиля линии, которая соединяет точки (xy, xycoords). В качестве значения данный параметр может принимать объект класса ConnectionStyle, или строку, в которой указывается стиль линии соединения с параметрами, перечисленными через запятую.

Класс Имя Атрибуты
Angle angle angleA=90, angleB=0, rad=0.0
Angle3 angle3 angleA=90, angleB=0
Arc arc angleA=0, angleB=0, armA=None, armB=None, rad=0.0
Arc3 arc3 rad=0.0
Bar bar armA=0.0, armB=0.0, fraction=0.3, angle=None

Ниже представлен пример, который демонстрирует возможности работы с параметром connectionstyle:

import math

fig, axs = plt.subplots(2, 3, figsize=(12, 7))

conn_style=[
    "angle,angleA=90,angleB=0,rad=0.0",
    "angle3,angleA=90,angleB=0",
    "arc,angleA=0,angleB=0,armA=0,armB=40,rad=0.0",
    "arc3,rad=-1.0",
    "bar,armA=0.0,armB=0.0,fraction=0.1,angle=70",
    "bar,fraction=-0.5,angle=180",
]

for i in range(2):
    for j in range(3):
        axs[i, j].text(0.1, 0.5, "\n".join(conn_style[i*3+j].split(",")))
        axs[i, j].annotate('text', xy=(0.2, 0.2),  xycoords='data',
            xytext=(0.7, 0.8), textcoords='data',
            arrowprops=dict(arrowstyle="->", connectionstyle=conn_style[i*3+j])
            )

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта. Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Книга: Линейная алгебра на Python
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas.  Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

Поделиться
Share on VK
VK
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook

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

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