Показаны сообщения с ярлыком matplotlib. Показать все сообщения
Показаны сообщения с ярлыком matplotlib. Показать все сообщения

30.09.2009

Пакет matplotlib. Наводим красивости

Продолжаем разговор о пакете matplotlib. Сегодня обсудим способы изменения внешнего вида элементов диаграмм - другими словами способы наведения красивостей.

Изменение свойств графических элементов пакета matplotlib

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

>>> import matplotlib.pyplot as plt
>>> line, = plt.plot([1, 2, 3])
>>> line
<matplotlib.lines.Line2D object at 0x030509D0>
>>> type(line)
<class 'matplotlib.lines.Line2D'>
>>> caption = plt.title(u'Заголовок диаграммы')
>>> caption
<matplotlib.text.Text object at 0x0308FC90>
>>> type(caption)
<class 'matplotlib.text.Text'>

Авторы пакета matplotlib предусмотрели три способа изменения свойств графических объектов.

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

>>> plt.plot([1, 2, 3], color = 'red', marker = '^', linestyle = '--', linewidth = 2, markersize = 5, label = u'Прямая линия')
[<matplotlib.lines.Line2D object at 0x02E3E150>]
>>> plt.title(u'Заголовок диаграммы', color = 'black', family = 'fantasy', fontsize = 'x-large')
<matplotlib.text.Text object at 0x02E66E10>

Второй способ. Как и подобает в соответствии с догмами объектно-ориентированного программирования, для каждого поля объекта существуют методы, предоставляющие возможность читать/писать значение поля. Уже существующий объект можно настроить посредством указанных методов:

>>> line, = plt.plot([1, 2, 3])
>>> line.set_color('red')
>>> line.set_marker('^')
>>> line.set_linestyle('--')
>>> line.set_linewidth(2)

В matplotlib принято следующее соглашение по именованию методов - метод возвращающий значение свойства property именуется get_property(), метод изменяющий значение свойства set_property()

Третий способ. Часто возникает необходимость для группы объектов (не обязательно экземпляров одного и того же класса) установить одинаковые значения для одного (нескольких) общих свойств. На этот случай авторы matplotlib предусмотрели специальную функцию matplotlib.pyplot.setp(*args, **kwargs) - "setup property" - установить свойство. Функция принимает ссылку или список ссылок на объекты и произвольный набор именованных переменных соответствующих изменяемым свойствам:

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> X = np.linspace(0.0, 5.0, 10)
>>> Y1 = X
>>> Y2 = 3 * X
>>> Y3 = 7 * X
>>> lines = plt.plot(X, Y1, X, Y2, X, Y3)
>>> plt.setp(lines, color = 'red', marker = '^', linestyle = '--', linewidth = 2)
[None, None, None, None, None, None, None, None, None, None, None, None]
>>> plt.show()

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

Пакет matplotlib. Пример использования функции setp()

Все три линии на диаграмме оформлены одинаково.

А какой глубокий смысл кроется в структуре возвращаемой функцией setp() я, честно говоря, не знаю.

Возможен и альтернативный синтаксис вызова функции. Вместо набора именованных переменных функция принимает набор пар: строка - имя свойства, произвольный тип - значение свойства (так принято работать с объектами в Matlab):

>>> plt.setp(lines, 'color', 'red', 'marker', '^', 'linestyle', '--', 'linewidth', 2)

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

>>> plt.setp(line, 'linestyle')
 linestyle: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'.
>>> plt.setp(line, 'color')
 color: any matplotlib color

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

>>> plt.setp(line)
  alpha: float (0.0 transparent through 1.0 opaque)
  animated: [True | False]
  antialiased or aa: [True | False]
  axes: an :class:`~matplotlib.axes.Axes` instance
  ...

Ну и если первый аргумент функции - список ссылок на объекты, описанные выше действия производятся для объекта, ссылка на который стоит в переданном списке первой.

В качестве примера приведу код программы использующей все три способа настройки объектов.

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

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

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# Значения по оси X
X = np.linspace(0.0, 2.0, 15)
# Значения по оси Y
Y_01 = X
Y_02 = X * 3
Y_03 = X * 7

# Задаем размер диаграммы
mpl.rcParams['figure.figsize'] = (8.0, 6.0)

# Строим диаграмму
# Линии
line_01 = plt.plot(X, Y_01)
line_02 = plt.plot(X, Y_02)
line_03 = plt.plot(X, Y_03)

# Сохраняем диаграмму в файл
plt.savefig('set_exmp_01.png', format = 'png')

В результате получим вот такое изображение:

Теперь, взяв за основу код предыдущего примера, настроим, как хотим, свойства каждой прямой.

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

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# Значения по оси X
X = np.linspace(0.0, 2.0, 15)
# Значения по оси Y
Y_01 = X 
Y_02 = X * 3
Y_03 = X * 7

# Задаем размер диаграммы
mpl.rcParams['figure.figsize'] = (8.0, 6.0)

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

# Линии

# Первый способ настройки объектов
line_01, = plt.plot(X, Y_01, color = 'blue', linestyle = ':', linewidth = 1, marker = 's',  markersize = 6, markeredgecolor = 'black', markerfacecolor = 'blue', markeredgewidth = 1, label = u'y = x' )

line_02,  = plt.plot(X, Y_02)
line_03,  = plt.plot(X, Y_03)

# Второй способ настройки объектов
line_02.set_color('red')
line_02.set_linestyle(':')
line_02.set_linewidth(1)
line_02.set_marker('D')
line_02.set_markersize(5)
line_02.set_markeredgecolor('black')
line_02.set_markerfacecolor('red')
line_02.set_markeredgewidth(1)
line_02.set_label(u'y = 3 * x')

# Третьий способ настройки объектов
plt.setp(line_03, color = 'magenta', linestyle = ':', linewidth = 1, marker = 'o', markersize = 6, markeredgecolor = 'black', markerfacecolor = 'magenta', markeredgewidth = 1, label = u'y = 7 * x')

# Задаем интервалы значений по осям X, Y
plt.axis((-0.03, 2.03, -0.2, 14.2))

# Добавим легенду
plt.legend(loc = 'best')

# Сохраняем диаграмму в файл
plt.savefig('set_exmp_02.png', format = 'png')

Теперь изображение будет выглядеть вот так:

Пакет matplotlib. Пример диаграммы при измененных значениях свойств объектов

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

Остановимся подробнее на свойствах объектов класса matplotlib.lines.Line2D - линии, которая неизбежно присутствует практически на каждой диаграмме.

О свойствах объектов класса matplotlib.lines.Line2D

Ниже в таблице приведены основные свойства объекта класса matplotlib.lines.Line2D.

Свойство Значение Описание
alpha Вещественное число в интервале [0.0, 1.0] Степень прозрачность элементов линии (собственно линии и маркеров) - от полностью прозрачного 0.0, до полностью непрозрачного 1.0. Пример использования смотри ниже
antialiased или aa True, False Включить (True), выключить (False) режим антиалиазинга элементов линии
color или c Один из возможных способов представления цвета в matplotlib, подробности смотри ниже Цвет линии
dash_capstyle Строки: 'butt', 'round', 'projecting' Стиль оконечностей пунктирной линии. Пример использования смотри ниже
dash_joinstyle Строки: 'miter', 'round', 'bevel' Стиль соединения пунктирных линий
dashes Список (кортеж) целых чисел, количество элементов списка должно быть четным Каждая пара чисел в списке рассматривается как количество индуцируемых точек, количество погашенных точек. С помощью свойства dashes можно рисовать линии состоящие из произвольного повторяющегося набора штрихов и пунктиров. Пример использования смотри ниже
drawstyle Строки: 'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post' Стиль отображения линии: 'default' - соседние точки соединены прямой, остальные значения - соседние точки соединены пересекающимися под прямым углом отрезками ("ступенькой") с различными вариациями пересечения отрезков. Пример использования смотри ниже
label Произвольная строка Подпись к линии, используется при создании легенды диаграммы
linestyle или ls Строки: '-', '--', '-.', ':', 'steps', 'steps-pre', 'steps-mid', 'steps-post', 'None', ' ', '' Стиль линии. Пример использования первых четырех стилей был приведен ранее, пример использования следующих четырех (можно задавать и через свойство drawstyle) смотри ниже, 'None', пробел и пустая строка выключают отображение линии, (собственно линии, маркеры, при этом, будут отображаться)
linewidth или lw float Толщина линии в точках
marker Строки: '.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4', 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_' Стиль маркера. Пример использования был приведен ранее
markeredgecolor или mec Один из возможных способов представления цвета в matplotlib, подробности смотри ниже Цвет границы маркера
markeredgewidth или mew float Толщина границы маркера в точках
markerfacecolor или mfc Один из возможных способов представления цвета в matplotlib, подробности смотри ниже Цвет маркера
markersize или ms float Размер маркера в точках
markevery None, integer N, список/кортеж (integer start, integer N) Свойство определяет, как будут использоваться маркеры при построении данной линии. Если None будут отображены все маркеры. Если целое число N, будет отображен каждый N-ый маркер. Если кортеж целых чисел (start, N) будет отображен каждый N-ый маркер начиная с start. Пример использования смотри ниже
solid_capstyle Строки: 'butt', 'round', 'projecting' Стиль оконечностей непрерывной линии
solid_joinstyle Строки: 'miter', 'round', 'bevel' Стиль соединения непрерывных линий
visible True, False В случае False линия и маркеры становятся невидимыми. True включает отображение элементов линии
zorder integer Порядок наложения элементов диаграммы (Z-order). Элемент с наибольшим значением zorder будет отображен на переднем плане (по отношению к наблюдателю) или, другими словами, элемент с наибольшим zorder будет отображен последним (самым верхним). Пример использования смотри ниже

Способы представления цвета в пакете matplotlib

Как следует из названия подраздела цвет в matplotlib может быть задан несколькими способами.

Способ первый. Из системы Matlab позаимствованы обозначения для восьми базовых цветов в виде отдельных символов.

Символ Цвет
'b' blue синий
'g' green зеленый
'r' red красный
'c' cyan бирюзовый
'm' magenta пурпурный
'y' yellow желтый
'k' black черный
'w' white белый
>>> plt.plot(X, Y_02, color = 'm')

Способ второй. Цвет можно задать используя стандартные обозначения цветов принятые в html, как то 'red', 'silver', 'olive' и так далее.

>>> plt.plot(X, Y_02, color = 'navy')

Способ третий. Произвольный цвет можно задать воспользовавшись HEX стилем представления цвета в html: '#cc00cc', '#9900ff', '#0099cc'.

>>> plt.plot(X, Y_02, color = '#003399')

Способ четвертый. Произвольный цвет так же можно задать передав кортеж из трех вещественных чисел, каждое из которых пренадлежит интервалу [0.0, 1.0]. Числа соответствуют представлению цвета в системе RGB: (0.75, 0.0, 1.0), (1.0, 0.33, 0.33), (0.0, 0.47, 0.21).

>>> plt.plot(X, Y_02, color = (0.0, 0.5, 0.32))

Способ пятый. Вариация на тему четвертого способа. Цвет в градации серого можно задать передав строку являющуюся представлением вещественного числа в диапазоне [0.0, 1.0], '0.0' - совсем черный, '1.0' - совсем белый.

>>> plt.plot(X, Y_02, color = '0.75')

Свойства linestyle и drawstyle

Свойство linestyle включает в себя свойство drawstyle - стили отрисовки "ступенек" можно задать как через drawstyle так и через linestyle. Пример использования на рисунке ниже:

Пакет matplotlib. Пример использования свойства drawstyle

Значения свойства drawstyle и остальные значения свойства linestyle можно комбинировать. Пример на рисунке ниже:

Пакет matplotlib. Пример использования свойства linestyle

Свойство dash_capstyle

Для того, чтобы ясно углядеть различия в начертаниях "кончика штриха" необходимо установить толщину линии как минимум в четыре точки. Пример использования на рисунке:

Пакет matplotlib. Пример использования свойства dash_capstyle

Свойство dashes

Когда существующие стили пунктирных линий не устраивают, можно поиграться с значениями свойства dashes:

Пакет matplotlib. Пример использования свойства dashes

Свойство markevery

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

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

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# Значения по оси X
X = np.linspace(0.0, 2.0, 36)
# Значения по оси Y
Y_01 = np.exp(X)
Y_02 = np.exp(X) + 5.0

# Задаем размер диаграммы
mpl.rcParams['figure.figsize'] = (8.0, 6.0)

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

# Линии
line_01,  = plt.plot(X, Y_01, 'ro--', markevery = None, label ='markevery = None')
line_02,  = plt.plot(X, Y_02, 'bo--', markevery = (0, 5), label = 'markevery = (0, 5)')
# Подпись к диаграмме
plt.title(u'Свойство markevery')
# Добавляем легенду
plt.legend(loc = 'best')
# Задаем интервалы значений по осям X, Y
plt.axis((-0.03, 2.03, -0.03, 14.0))

# Сохраняем диаграмму в файл
plt.savefig('markevery.png', format = 'png')

А вот результат прогона кода:

Пакет matplotlib. Пример использования свойства markevery

Свойство zorder

Чем больше значение свойства zorder тем ближе к наблюдателю объект:

Пакет matplotlib. Пример использования свойства zorder

Свойство alpha

Для иллюстрации "прозрачности" воспользуемся предыдущим рисунком. Получилось коряво, но смысл свойства alpha понять можно (в matplotlib атрибут прозрачности жутко портит некоторые цвета)

Пакет matplotlib. Пример использования свойства alpha

Ну вот пожалуй на сегодня и все...

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


Читать далее...

21.08.2009

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

Часто для различных научно-технических надобностей требуется график с двумя осями ординат (осями Y) и одной общей осью абсцисс (осью X). Вот python скрипт, который строит такой график.

 1 # -*- coding: UTF-8 -*-
 2 
 3 import matplotlib as mpl
 4 import matplotlib.pyplot as plt
 5 
 6 # Значения по оси X (Большая часть данных опущена)
 7 
 8 # Время, ч
 9 
10 X = [0.00, 0.08, 0.17, ... 3.42, 3.50]
11 
12 # Значения по осям Y (Большая часть данных опущена)
13 
14 # Степнь разложения
15 
16 Y_01 = [0.0000, 0.0000, 0.0000, ... 0.8180, 0.8482]
17 
18 # Температура, oC
19 
20 Y_02 = [ 21, 30, 70, ... 721, 724 ]
21 
22 # Задем размеры изображения диаграммы
23 
24 mpl.rcParams['figure.figsize'] = (8.0, 6.0)
25 
26 # Строим диаграмму
27 
28 # Получаем ссылку на объект типа matplotlib.axes.AxesSubplot, текущую диаграмму 
29 
30 ax_01 = plt.axes()
31 
32 # Задаем исходные данные для первой линии диаграммы (линии степени разложения), внешний вид линии и маркера.
33 # Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D
34 
35 line_01, = ax_01.plot(X, Y_01, 'bh:')
36 
37 # Задаем интервалы значений по осям X и основной оси Y
38 
39 ax_01.axis([-0.04, 3.6, -0.01, 0.90])
40 
41 # Включаем сетку по оси X и основной оси Y. Задаем цвет сетки
42 
43 ax_01.grid(color = 'b')
44 
45 # Задаем подписи к осям X и основной оси Y
46 
47 ax_01.set_xlabel(u'Время, ч')
48 ax_01.set_ylabel(u'Степень разложения')
49 
50 # Задаем заголовок диаграммы
51 
52 ax_01.set_title(u'Термограмма разложения оксалата кальция')
53 
54 # Включаем дополнительную ось Y
55 
56 ax_02 = ax_01.twinx()
57 
58 # Задаем исходные данные для второй линии диаграммы (линии степени разложения), внешний вид линии и маркера.
59 # Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D
60 
61 line_02 = ax_02.plot(X, Y_02, 'ro:')
62 
63 # Задаем интервалы значений по осям X и дополнительной оси Y
64 
65 ax_02.axis([-0.04, 3.6, 0.0, 800.0])
66 
67 # Задаем подпись к дополнительной оси Y
68 
69 ax_02.set_ylabel(u'Температура, \u00b0C')
70 
71 # Включаем сетку по дополнительной оси Y. Задаем цвет сетки
72 
73 ax_02.grid(color = 'r')
74 
75 # Задаем исходные данные для легенды и место ее размещение
76 
77 ax_02.legend((line_01, line_02), (u'Степень разложения', u'Температура'), loc = 'best')
78 
79 # Сохраняем построенную диаграмму в файл
80 # Задаем имя файла и его тип
81 
82 plt.savefig('termo.png', format = 'png')

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

Matplotlib. Пример графика с двумя осями ординат

Пояснения к скрипту.

В начале небольшое отступление. Matplotlib при работе со своими графическими объектами придерживается следующей идеологии: существуют текущая фигура (в документации figure) и текущая гм... диаграмма (в документации axes). Фигура это некое полотно на котором происходит построение чего либо. Диаграмма это объект принадлежащий фигуре (одной фигуре может принадлежать несколько диаграмм), к которому собственно и применяются команды pyplot. Диаграммы могут быть различных типов (в нашем случае прямоугольная 2D - обычный график). Тип диаграммы задается командой её построения (в нашем случае plot()) и определяет назначение диаграммы, внешний вид, свойства и возможные действия с ней.

В выражении ax_01 = plt.axes() мы получаем ссылку на объект типа matplotlib.axes.AxesSubplot - текущую диаграмму. Далее, при построении графика, мы пользуемся методами этого объекта, действие которых в целом аналогично действию рассмотренным в предыдущих постах функций модуля pyplot.

После построения первой линии диаграммы (зависимости степени разложения от времени) создаем новый объект класса matplotlib.axes.Axes и получаем ссылку на него: ax_02 = ax_01.twinx(). В результате на диаграмму ax_01 будет "наложена" вторая диаграмма ax_02, при этом, ось X будет общей для обеих диаграмм. Далее с помощью тех же методов, только уже принадлежащими объекту ax_02 строим и оформляем вторую линию (зависимость температуры от времени).

Вот и все, сохраняем получившееся творение.

Подробнее о фигурах и диаграммах поговорим позже.

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

Следующий пост по теме: Пакет matplotlib. Наводим красивости.


Читать далее...

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. График с дополнительной осью ординат.


Читать далее...

09.08.2009

Пакет matplotlib. Установка, проверка, настройка

Введение

matplotlib - набор дополнительных модулей (библиотек) языка Python. Предоставляет средства для построения самых разнообразных 2D графиков и диаграмм данных. Достоинства. Отличается простотой использования - для построения весьма мудреных и красочно оформленных диаграмм достаточно нескольких строк кода. При этот качество получаемых изображений более чем достаточно для их публикования. Один из выходных формата файлов - Postscript, что, соответственно, позволяет вставлять изображения в документы TeX. Предоставляет API для встраивания своих графических объектов в приложения пользователя.

Установка

Официальный сайт проекта matplotlib. Дистрибутив для Windows можно заполучить на Sourceforge. Текущая версия 0.99.0, выпущена 06 августа 2009.

Для установки необходим, разумеется, сам Python и модуль NumPy. NumPy предоставляет методы для работы с огромными многомерными массивами. Дистрибутив для Windows так же можно взять на Sourceforge. Текущая версия 1.3.0 от 05 апреля 2009.

В Windows установка и matplotlib и NumPy не должна вызвать ни каких проблем. Скачиваем и запускаем файл дистрибутива.

Проверка

После установки проверяем работоспособность. Запускаем консоль Python, вводим:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x0301E810>]
>>> plt.title('Прямая линия')
<matplotlib.text.Text object at 0x03062430>
>>> plt.show()

В результате должно появиться вот такое окно диаграммы:

Matplotlib. Пример окна диаграммы

Что было сделано? Из пакета matplotlib импортирован модуль pyplot под именем plt. Модуль pyplot содержит функции (похожие на команды) создания диаграмм и изменения свойств их элементов. Функция plot() строит прямоугольные двумерные диаграммы (графики) в координатах X - Y. Если функции plot передан один аргумент (в нашем случае - список [1,2,3]), она рассматривает его как совокупность значений откладываемых по оси Y, тогда по оси X ему будет соответствовать автоматически сгенерированный набор чисел 0,1,2...N - 1, где N - число элементов в переданном списке. Функция title() задает заголовок диаграммы, а функция show() выводит интерактивное окно диаграммы. В общем все очень просто. Вот только вместо заголовка диаграммы "Прямая линия" 11 прямоугольников, не настроенный matplotlib не может найти шрифты с кириллическими символами.

Настройка

Пакет matplotlib можно легко настроить через конфигурационный файл matplotlibrc. Если Python установлен в папку C:\Python26\ файл matplotlibrc находится в папке: C:\Python26\Lib\site-packages\matplotlib\mpl-data\. Вносить изменения можно прямо здесь, но лучше скопировать файл в папку пользователя: C:\Documents and Settings\UserName\.matplotlib\, иначе при переустановке пакета конфигурационный файл будет перезаписан. Параметры пакета задаются в файле в виде пар свойство : значение, символ # отделяет комментарий. Свойство font.family определяет тип активного шрифта по умолчанию, может принимать пять значений: serif, sans-serif, cursive, fantasy, monospace. В свою очередь свойства font.serif, font.sans-serif, font.cursive, font.fantasy, font.monospace содержат списки имен шрифтов (через запятую, в порядке уменьшения приоритета) соответствующих каждому типу. Для "русификации" matplotlib необходимо изменить имена шрифтов в списке, на имена доступных в системе шрифтов, содержащих кириллические символы. Например так:

font.serif : Verdana, Arial
font.sans-serif : Tahoma, Arial
font.cursive : Courier New, Arial
font.fantasy : Comic Sans MS, Arial
font.monospace : Arial

Для корректного отображения кириллических символов так же необходимо внести небольшие изменения в код программы. Все строки, содержащие символы национальных алфавитов должны быть типа unicode. Тип строкового литерала необходимо указать явно.

plt.title(u'Прямая линия')

В случае скрипта исходный файл должен быть в кодировке UTF-8. Кодировку файла так же следует указать явно. Для этого в первых строках программы пишем:

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

Вносим изменения в файл matplotlibrc, повторяем ввод в консоле Python:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x02F118F0>]
>>> plt.title(u'Прямая линия')
<matplotlib.text.Text object at 0x02F59510>
>>> plt.xlabel(u'Значения по оси X')
<matplotlib.text.Text object at 0x02F1BBF0>
>>> plt.ylabel(u'Значения по оси Y')
<matplotlib.text.Text object at 0x02F44D10>
>>> plt.show()

Ну вот теперь подписи диаграммы отображаются корректно:

Matplotlib. Пример окна диаграммы

Функции pyplot.xlabel(), pyplot.ylabel(), как легко догадаться по названию, устанавливают подписи к осям X и Y соответственно.

Пакет matplotlib можно настраивать и динамически (во время выполнения программы). В пакете определена структура matplotlib.rcParams, с которой работают как со словарем. Ключевые слова в данном случае - имена свойств файла matplotlibrc.

Настройки шрифтов через matplotlib.rcParams можно изменить например так:

>>> import matplotlib as mpl
>>> import matplotlib.pyplot as plt
>>> mpl.rcParams['font.family'] = 'fantasy'
>>> mpl.rcParams['font.fantasy'] = 'Comic Sans MS, Arial'
>>> plt.plot([1,2,3,4], [1,4,9,16], 'ro')
[<matplotlib.lines.Line2D object at 0x02E837B0>]
>>> plt.title(u'Парабола')
<matplotlib.text.Text object at 0x02E65530>
>>> plt.xlabel(u'Значения x')
<matplotlib.text.Text object at 0x02E2DC70>
>>> plt.ylabel(u'Значения x в квадрате')
<matplotlib.text.Text object at 0x02E50D30>
>>> plt.show()

В результате должно получиться вот что:

Matplotlib. Пример окна диаграммы

Функции pyplot.plot() можно передать произвольное число пар аргументов типов list или array (тип array определен в модуле numpy). В примере выше передана одна пара: [1,2,3,4], [1,4,9,16]. Первый элемент каждой пары функция рассматривает как значения откладываемые по оси X, второй элемент как значения по оси Y. Соответственно для каждой пары элементов строиться своя кривая на диаграмме. После каждой пары данных может быть передан дополнительный аргумент типа string - строка форматирования, которая определяет внешний вид кривой. Формат строки позаимствован из системы Matlab. Строка включает три подстроки. Первая подстрока задает цвет графического элемента, вторая стиль маркера, третья стиль линии. В примере 'ro' = 'r' + 'o', где 'r' - красный, 'o' - кружок. По умолчанию 'b-' - синяя непрерывная линия.

Немного о назначении кнопок интерактивного окна диаграммы.

Кнопка

Matplotlib. Кнопка pan/zoom

(pan/zoom) предназначена для прокрутки/масштабирования диаграммы. Нажимаем на кнопку, указатель мыши приобретает вид перекрещенных стрелок. Если двигать мышь и удерживать левую кнопку - диаграмма будет прокручиваться по направлению движения указателя. Если двигать мышь и удерживать правую кнопку - масштаб диаграммы будет изменяться, при движении вверх/вправо - уменьшаться, вниз/влево - увеличиваться. При нажатых клавишах "x" и "y" перемещение/масштабирование диаграммы будет происходить по осям X и Y соответственно, при нажатой клавише Ctrl диаграмма будет изменяться так, чтобы сохранились её пропорции (aspect ratio).

Кнопка

Matplotlib. Кнопка прямоугольного масштабирования

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

Кнопки

Matplotlib. Кнопка навигации

позволяют перемещаться по истории изменения диаграммы. Все изменения вносимые в диаграмму пользователем (масштабирование, прокрутка) запоминаются. Кнопки со стрелками позволяют перемещаться вперед/назад по имеющимся вариантам диаграммы. Кнопка с домиком возвращает диаграмму к исходному состоянию.

Кнопка

Matplotlib. Кнопка сохранения диаграммы

вызывает стандартный для системы диалог сохранения файла. Позволяет сохранить диаграмму в файл. Можно выбрать следующие форматы файла диаграммы: png, pdf, svg, eps, ps. К сожалению не работает сохранение в формате emf (модуль pyemf разработчиком больше не поддерживается). Через формат emf было очень удобно вставлять диаграммы в документы Word.

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


Читать далее...