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. Наводим красивости.

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