Использование библиотеки Matplotlib. Как добавить легенду к графику | jenyay.net

Использование библиотеки Matplotlib. Как добавить легенду к графику

Легендой называют табличку внутри или около графика, в которой показано какая линия каким данным соответствует или как-то иначе пытается показать, чем отличается по смыслу одна линия на графике от другой. Самый простой способ показать легенду - это вызвать функцию legend() из пакета matplotlib.pyplot, но кроме этого есть и другие способы.

Первый способ

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

Следующий пример рисует два графика и к каждому из них добавляет описание в виде легенды.

# coding: utf-8

# Импортируем один из пакетов Matplotlib
import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X
    xmin = -20.0
    xmax = 20.0

    # Шаг между точками
    dx = 0.1

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.arange(xmin, xmax + dx, dx)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x)
    y2 = np.sinc(x * 0.2)

    # Нарисуем два одномерных графика
    plt.plot(x, y1, 'b-')
    plt.plot(x, y2, 'g--')

    # !!! Добавим легенду
    # !!! Первому графику будет соответствовать надпись 'f(x)',
    # !!! А второму - 'f(x * 0.2)'
    plt.legend (('f(x)', 'f(x * 0.2)'))

    # Покажем окно с нарисованным графиком
    plt.show()

В результате будет показан следующий график:

Второй способ

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

Более аккуратно того же самого результата мы можем добиться, если при рисовании графиков в функцию plot() мы будем передавать дополнительный именованный параметр label с описанием кривой, а затем вызовем функцию legend() без параметров.

# coding: utf-8

# Импортируем один из пакетов Matplotlib
import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X
    xmin = -20.0
    xmax = 20.0

    # Шаг между точками
    dx = 0.1

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.arange(xmin, xmax + dx, dx)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x)
    y2 = np.sinc(x * 0.2)

    # Нарисуем два одномерных графика
    # !!! Метки сразу привязываем к соответствующей кривой графика
    plt.plot(x, y1, 'b-', label='f(x)')
    plt.plot(x, y2, 'g--', label='f(x * 0.2)')

    # !!! Добавим легенду
    plt.legend ()

    # Покажем окно с нарисованным графиком
    plt.show()

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

Третий способ

Также метки можно устанавливать, передавая в функцию legend() два списка: список из экземпляров классов кривых, которые возвращает функция plot(), а также список меток. При этом длины этих двух списков должны быть одинаковыми. Этот способ особенно удобен, если вы в одном вызове функции plot() создаете несколько кривых. Например:

# coding: utf-8

# Импортируем один из пакетов Matplotlib
import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X
    xmin = -20.0
    xmax = 20.0

    # Шаг между точками
    dx = 0.1

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.arange(xmin, xmax + dx, dx)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x)
    y2 = np.sinc(x * 0.2)

    # Нарисуем два одномерных графика
    line1, line2 = plt.plot(x, y1, 'b-', x, y2, 'g--')

    # !!! Добавим легенду
    plt.legend ([line1, line2], ['f(x)', 'f(x * 0.2)'])

    # Покажем окно с нарисованным графиком
    plt.show()

Четвертый способ

Предыдущий пример можно модифицировать таким образом, чтобы метки привязывались к кривым с помощью метода set_label() из класса, отвечающего за отображение кривых. Такой способ показан в следующем примере:

# coding: utf-8

# Импортируем один из пакетов Matplotlib
import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X
    xmin = -20.0
    xmax = 20.0

    # Шаг между точками
    dx = 0.1

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.arange(xmin, xmax + dx, dx)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x)
    y2 = np.sinc(x * 0.2)

    # Нарисуем два одномерных графика
    line1, line2 = plt.plot(x, y1, 'b-', x, y2, 'g--')

    # !!! Установим метки с помощью метода set_label()
    line1.set_label('f(x)')
    line2.set_label('f(x * 0.2)')

    # !!! Добавим легенду
    plt.legend ()

    # Покажем окно с нарисованным графиком
    plt.show()

Заголовок легенды

Функция legend() может принимать достаточно большое количество дополнительных параметров, чтобы более тонко настраивать внешний вид и положение легенды (см. статью Как менять положение легенды). В данной статье мы рассмотрим только один из них, который позволяет добавить в легенду заголовок. Для этого надо передать дополнительный строковый параметр title со строкой заголовка.

# coding: utf-8

# Импортируем один из пакетов Matplotlib
import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X
    xmin = -20.0
    xmax = 20.0

    # Шаг между точками
    dx = 0.1

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.arange(xmin, xmax + dx, dx)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x)
    y2 = np.sinc(x * 0.2)

    # Нарисуем два одномерных графика
    # !!! Метки сразу привязываем к соответствующей кривой графика
    plt.plot(x, y1, 'b-', label='f(x)')
    plt.plot(x, y2, 'g--', label='f(x * 0.2)')

    # !!! Добавим легенду
    plt.legend(title='f(x) = sinc(x)')

    # Покажем окно с нарисованным графиком
    plt.show()

В результате график будет выглядеть следующим образом:

Остальные примеры

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.8/5. Всего 13 голос(а, ов)



Dim 18.11.2012 - 12:18

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


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 693