Часто для различных научно-технических надобностей требуется график с двумя осями ординат (осями 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 при работе со своими графическими объектами придерживается следующей идеологии: существуют текущая фигура (в документации 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. Наводим красивости.
Спасибо за познавательную статью!
ОтветитьУдалить