10.08.2009

Пакет matplotlib. Строим банальный график

Те кому хотя бы раз в жизни приходилось обучаться в техническом ВУЗ'е строили такие графики штук по 5-10 в день. Банальный график это две пересекающиеся под прямым углом линии (координатные оси) на которые нанесены масштабные деления с числами. Линии снабжены подписями - что собственно эти числа обозначают. В плоскости образованной линиями, тем или иным способом (с помощью точек, кружков, треугольничков, крестиков и т.д.) помечаются некоторые значения. График снабжается легендой, чтобы можно было узнать чем кружки отличаются от крестиков и подписью, чтобы можно было узнать что и зачем построено. Вот именно такой график рисует нижеприведенный скрипт.

# -*- coding: UTF-8 -*-

import matplotlib.pyplot as plt

# Значения по оси X

X = [20.0, 40.0, 60.0, 80.0, 100.0]

# Набор значений по оси Y

Y_10 = [0.97252, 0.94238, 0.89927, 0.85197, 0.79784]
Y_20 = [0.96864, 0.93518, 0.89113, 0.84344, 0.78934]
Y_30 = [0.96395, 0.92770, 0.88278, 0.83473, 0.78075]

# Строим диаграмму

# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.
# Функция plot() возвращает кортеж ссылок на объекты класса matplotlib.lines.Line2D

line_10, line_20, line_30 = plt.plot(X, Y_10, 'bD:', X, Y_20, 'r^:', X, Y_30, 'go:')

# Задаем интервалы значений по осям X и Y

plt.axis([15.0, 105.0, 0.75, 1.0])

# Задаем заголовок диаграммы

plt.title(u'Зависимость плотности водных растворов этилового спирта от температуры')

# Задаем подписи к осям X и Y

plt.xlabel(u'Массовая доля этилового спирта, %')
plt.ylabel(u'Плотность, г/мл')

# Задаем исходные данные для легенды и ее размещение

plt.legend( (line_10, line_20, line_30), (u'Температура 10 \u00b0C', u'Температура 20 \u00b0C', u'Температура 30 \u00b0C'), loc = 'best')

# Включаем сетку

plt.grid()

# Сохраняем построенную диаграмму в файл

# Задаем имя файла и его тип

plt.savefig('spirit.png', format = 'png')

В результате выполнения скрипта файл spirit.png должен содержать такое изображение.

Matplotlib. Незамысловатый график

Комментарии к коду.

Функция plot() строит 2D диаграмму - задает исходные данные и внешний вид линии (линий) диаграммы. Функция принимает произвольное число наборов аргументов вида X_set, Y_set, format_string. Где X_set и Y_set типа list или numpy.array - значения откладываемые по осям X и Y соответственно, format_string - строка форматирования (не обязательный аргумент набора), определяет стиль и цвет линии. Строка форматирования (позаимствована из системы Matlab) включает (в произвольном порядке) три подстроки определяющих стиль линии, стиль маркера, цвет. Например 'g^:' = 'g' + '^' + ':' - цвет зеленый, маркер треугольник вершиной вверх, линия состоит из точек.

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

Стили линий


Символ Описание
'-' solid line style непрерывная линия
'--' dashed line style линия из штрихов
'-.' dash-dot line style чередование штрихов и точек
':' dotted line style линия из точек

Matplotlib. Стили линий

Стили маркеров


Я умышленно не стал переводить названия маркеров из документации, дабы не придумывать как по русски выразить различия между point marker и pixel marker или как обозвать tri_right marker с thin_diamond marker.

Символ Описание
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
'|' vline marker
'_' hline marker

Matplotlib. Стили маркеров

Цвета


Символ Цвет
'b' blue синий
'g' green зеленый
'r' red красный
'c' cyan бирюзовый
'm' magenta пурпурный
'y' yellow желтый
'k' black черный
'w' white белый

Matplotlib. Цвета

Функция plot() возвращает кортеж ссылок на объекты класса matplotlib.lines.Line2D. Каждый из объектов кортежа представляет линию на диаграмме. Посредством методов объектов можно менять свойства (внешний вид) любой из линий. В нашем случае кортеж ссылок в дальнейшем передается функции legend().

Функция axis() задает свойства осей диаграммы. В частности с её помощью можно установит масштаб осей. Для этого функции необходимо передать одни аргумент - список из четырех значений. Функция рассматривает такой список как [x_min, x_max, y_min, y_max], где x_min, y_min минимальные, x_max, y_max максимальные значения откладываемые по осям X и Y соответственно.

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

Аргумент Действие
'off' Выключает отображение осей (вместе с подписями)
'equal' Изменяет масштаб по осям так, чтобы равному изменению x или y соответсвовала одинаковая длинна на диаграмме. Как сказано в документации "круг превращается в круг".
'scaled' Тот же эффект, что у 'equal' достигается изменением соотношения сторон диаграммы.
'tight' Масштаб по осям изменяется так, что бы отображались все данные. Если все данные уже находятся в поле диаграммы, масштаб изменяется так, чтобы линии располагались в центре диаграммы.

Функция legend() задает свойства и расположения легенды диаграммы. В примере использован вызов функции принимающий в качестве первых двух аргументов кортежи - первый содержит ссылки на объекты типа Line2D, второй соответствующие им подписи. Именованный аргумент loc задает расположение легенды, может быть или строкой или числом. Возможные варианты значений аргумента loc представлены в таблице.

Значения аргумента loc Расположение легенды
Строка Число
'best' 0 Оптимальное расположение легенды определяется автоматически. Значение по умолчанию.
'upper right' 1 сверху справа
'upper left' 2 сверху слева
'lower left' 3 снизу слева
'lower right' 4 снизу справа
'right' 5 справа
'center left' 6 в центре слева
'center right' 7 в центре справа, не отличается от 'right'
'lower center' 8 в сентер снизу
'upper center' 9 в центре сверху
'center' 10 в центре диаграммы

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

# Строим диаграмму

# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров, подписи.

plt.plot(X, Y_10, 'bD:',  label = u'Температура 10 \u00b0C')
plt.plot(X, Y_20, 'r^:',  label = u'Температура 20 \u00b0C')
plt.plot(X, Y_30, 'go:',  label = u'Температура 30 \u00b0C')

# Добавляем к диаграмме легенду

plt.legend(loc = 'best')

Функция grid() строит сетку координатных осей.

Функция savefig() сохраняет диаграмму в файл. Первый аргумент - строка, путь к файлу. Именованный аргумент format - строка, задает формат файла, может принимать значения 'png', 'pdf', 'ps', 'eps', 'svg'.

Здесь необходимо сказать пару слов о размерах и разрешении получающихся изображений диаграмм. В файле matplotlibrc можно задать два свойства figure.figsize и figure.dpi (свойства можно задать, разумеется и через структуру rcParams, смотри предыдущий пост).

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

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

Предыдущий пост по теме: Пакет matplotlib. Установка, проверка, настройка.

Следующий пост по теме: Пакет matplotlib. График с дополнительной осью ординат.

2 комментария:

  1. Can you tell us more about this? I'd care to find out some additional information.

    my weblog fatloss factor reviews

    ОтветитьУдалить
  2. А отобразить показатели данных на диаграмме?

    ОтветитьУдалить