Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Визуализация научных данных: введение в Matplotlib

Оригинал: Scientific Graphics Visualisation: An Introduction to Matplotlib
Автор: Deepu Benson
Дата публикации: 25 мая 2018 года
Перевод: А. Кривошей
Дата перевода: сентябрь 2019 г.

Визуализация - это графическое отображение информации. Обучение и познание улучшается благодаря визуализации. Хотя не все мы прирожденные художники, для визуализации научной графики просто необходимы знания кода для визуализации идей и концепций.

Число исследователей увеличивается с каждым днем. Одна из проблем, с которой часто сталкиваются исследователи, заключается в том, как наилучшим образом донести свои результаты до сообщества и широкой общественности. Ну, нет простых способов выразить сложные научные идеи простыми словами. Знаменитая английская идиома «A picture is worth a thousand words» подсказывает нам решение. Изображения передают идеи простым, но элегантным способом. Однако научная визуализация не ограничивается только исследователями - профессионалам, работающим в различных областях, таких как информационные технологии, банковское дело, автомобили и здравоохранение, также нужны хорошие инструменты визуализации.

В этой серии из трех частей, посвященной визуализации научной графики, мы обсудим три мощных инструмента, используемых для этой цели - это Matplotlib, PGF/TikZ и PSTricks. Хотя ни один из этих инструментов не может полностью заменить два других, освоение хотя бы одного из них очень поможет исследователям и специалистам. Эта серия поможет читателю быстро изучить основы этих трех инструментов, а затем решить, освоить ли один, два или все три. Все эти инструменты являются бесплатными и с открытым исходным кодом. Дополнительным преимуществом является то, что все три из них идеально сочетаются с LaTeX, лучшим инструментом для подготовки научных документов.

Matplotlib

Matplotlib - это библиотека графики для языка программирования Python, лицензированная по лицензии Python Software Foundation (PSF License), лицензии на свободное программное обеспечение, совместимой с GNU General Public License. Используя Matplotlib, вы можете создавать графики, гистограммы, диаграммы рассеяния и т. д., с помощью всего лишь нескольких строк кода. Matplotlib работает в тандеме с NumPy, математической библиотекой для Python. Она работает как кроссплатформенная библиотека визуализации данных, построенная на массивах NumPy, и предназначена для работы в стеке Scipy. Поддерживается Python 2, Python 3 и IPython. Фактически, Matplotlib была впервые разработана как патч для IPython, для обеспечения интерактивной прорисовки в стиле MATLAB из оболочки IPython.

В настоящее время я использую Fedora 24 и при поиске обнаружил, что по умолчанию в моей системе установлен Python 3. Но в отличие от Python 2 и IPython, пакеты Matplotlib и NumPy не были частью моей установки Python 3; поэтому мне пришлось установить их вручную. После успешной установки, когда команды python, python3 и ipython запускаются в терминале, вы попадете в оболочки Python 2, Python 3 и IPython соответственно. Чтобы использовать Matplotlib, вам нужно сначала импортировать этот пакет с помощью команды:

import matplotlib

Ранняя разработка Matplotlib велась Джоном Д. Хантером, и первая общедоступная версия Matplotlib версии 0.1 была выпущена в 2003 году. Последней стабильной версией Matplotlib является версия 2.2.0, выпущенная 6 марта 2018 года. Рисунок 1 показывает логотип Matplotlib.

После импорта Matplotlib, если вы выполните команду «matplotlib._ _version_ _» в оболочке, вы сможете узнать версию Matplotlib, работающую в вашей системе. Это не всегда тот случай, когда Python 2 и Python 3 используют одну и ту же версию Matplotlib. В моей системе Python 2 и IPython используют версию 1.5.2, тогда как Python 3 использует версию 2.2.0. Хотя я проверил доступность Matplotlib в Python 2, Python 3 и IPython, все программы Python в этой статье тестируются только с Python 2, так что незначительные различия между различными версиями Matplotlib не будут препятствовать продвижению нашего обсуждения. Как упоминалось ранее, Matplotlib можно использовать в разных контекстах - важные находятся внутри скрипта, внутри оболочки и внутри записной книжки IPython, называемой Jupyter. Записная книжка IPython - это интерактивный инструмент анализа данных на основе браузера, который может объединять повествование, код, графику, элементы HTML и другие мультимедийные компоненты в один исполняемый документ.

логотип Matplotlib

Рисунок 1: логотип Matplotlib

Синус, косинус и тангенс в Matplotlib

Рисунок 2: Синус, косинус и тангенс в Matplotlib

Модули в Matplotlib

Pyplot - это модуль в Matplotlib. Это набор функций командного стиля, которые делают Matplotlib похожим на MATLAB. Функции Pyplot вносят некоторые изменения в график. Например, Pyplot может создать график и выделить область построения для этого графика, а затем построить ряд линий в области построения графика.

Другой такой модуль, предоставляемый Matplotlib, называется Pylab. Это модуль, который пакетно импортирует и mathplotlib.pyplot, и NumPy, математический пакет Python, для более легкого использования. Хотя использовать Pylab удобнее, из-за этого пакетного импорта в настоящее время его использование несколько не рекомендуется. Общее практическое правило, предлагаемое стандартной документацией Matplotlib, выглядит следующим образом: выбирайте Pyplot для неинтерактивного построения графиков и интерфейс Pylab для интерактивных вычислений и построения графиков, поскольку он минимизирует набор текста. Чтобы упростить ситуацию, наше обсуждение основано исключительно на Pyplot, и мы можем импортировать NumPy отдельно, если и когда это потребуется.

Простые линейные графики в Matplotlib

Давайте теперь посмотрим на простой пример с использованием Matplotlib. Код ниже показывает программу Python plot1.py. Эту и все другие программы на Python, обсуждаемые в этой статье, можно загрузить с http://opensourceforu.com/article_source_code/april18/matplot.zip.

import matplotlib.pyplot as pt
import numpy as np
a = np.linspace(-10,10,1000)
pt.plot(a,np.sin(a))
pt.plot(a,np.cos(a))
pt.plot(a,np.tan(a))
pt.show( )

Прежде чем приступить к выполнению программы, давайте попробуем разобраться в ней подробно. С помощью первых двух строк кода мы импортировали пакеты matplotlib.pyplot и numpy. Строка кода:

a = np.linspace(-10,10,1000)

… создает линейно разнесенный вектор «a», такой, что он содержит 1000 чисел от -10 до 10 с одинаковой разницей между каждой соседней парой чисел. В следующих трех строках кода используется функция plot() из Pyplot для построения функций синуса, косинуса и тангенса с использованием уже созданного вектора «a». Функция plot() отображает зависимость «у» от «х» в виде линий. В одном из примеров, который будет обсуждаться позже, мы будем использовать маркеры вместо линий для построения с помощью plot(). Функции sin(), cos() и tan() предоставляются пакетом NumPy. Последняя строка кода:

pt.show( )

… отображает фигуру на экране. Вы можете запустить программу plot1.py в Python 2 с помощью команды:

python plot1.py

Функции синус и косинус  в Matplotlib

Рисунок 3: Функции синус и косинус в Matplotlib

Совмещенные графики в Matplotlib

Рисунок 4: Совмещенные графики в Matplotlib

На рисунке 2 показан графический вывод, созданный Matplotlib и Python 2. Тот же результат можно получить, если выполнить каждую строку кода в оболочке Python 2.

Что ж, немного удивительно, что на полученной фигуре отсутствуют знакомые волны синуса и косинуса. На изображении видны только касательная функция и две пересекающиеся прямые линии. Мы что-то сделали не так? Точно нет! Тогда почему мы получили именно этот вывод? Функции синуса и косинуса принимают значения от -1 до 1, а функция тангенса принимает значения от -∞ до + ∞. Таким образом, синусоидальная волна и волна косинуса выглядят как прямые линии из-за большого интервала по оси Y. Если вы посмотрите на нижнюю часть изображения, вы увидите вариант для его увеличения. Если вы нажмете кнопку и увеличите масштаб вдоль оси Y, вместо прямых линий вы увидите обычные синусоидальные и косинусные волны. Еще лучше, просто закомментируйте строку кода:

pt.plot(a,np.tan(a))

в виде:

#pt.plot(a,np.tan(a))

… чтобы получить программу plot2.py. При выполнении этой программы вы получите вывод, показанный на рисунке 3, на котором изображены только функции синуса и косинуса.

Совмещенные графики в Matplotlib

В предыдущих программах несколько функций были построены на одном графике, но теперь мы попытаемся разместить графики разных функций на разных участках одного и того же изображения. Рассмотрим программу plot3.py, приведенную ниже:

import matplotlib.pyplot as pt
import numpy as np
a = np.linspace(-10,10,1000)
pt.subplot(2,1,1)
pt.plot(a,np.sin(a))
pt.subplot(2,1,2)
pt.plot(a,np.tan(a))
pt.show( )

Есть только две строки кода, которые были введены в plot3.py. Строка кода:

pt.subplot(2,1,1)

… показывает, что график имеет две строки, один столбец, а первый вспомогательный участок должен быть размещен на первой панели. Строка кода:

pt.subplot(2,1,2)

… указывает на то, что второй вспомогательный участок должен быть размещен на второй панели графика с двумя строками и одним столбцом. Две функции, представленные программой, являются тригонометрическими функциями синуса и тангенса. При запуске программы plot3.py выдаст изображение, показанное на рисунке 4.

Цвета и маркеры на графиках

Рисунок 5: Цвета и маркеры на графиках

Image.png

Рисунок 6: Image.png

Стили и цвета линий в Matplotlib

До сих пор мы рисовали линии только в одном стиле без установки определенных цветов для определенных линий в Matplotlib. Но не думайте, что это предел Matplotlib, который на самом деле может выполнять множество задач с помощью простых команд. В этом разделе мы рассмотрим, как Matplotlib может использовать различные стили и цвета при рисовании изображений. Рассмотрим программу plot4.py, которая использует различные стили и цвета при рисовании функции синуса, с которой мы уже хорошо знакомы:

import matplotlib.pyplot as pt
import numpy as np
a = np.linspace(-10,10,1000)
pt.plot(a,np.sin(a-0),’o’,color=’red’)
pt.plot(a,np.sin(a-1),’-’,color=’green’)
pt.plot(a,np.sin(a-2),’--’,color=’blue’)
pt.plot(a,np.sin(a-3),’.’,color=’yellow’)
pt.plot(a,np.sin(a-4),’v’,color=’pink’)
pt.plot(a,np.sin(a-5),’>’,color=’orange’)
pt.show( )

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

pt.plot(a,np.sin(a-0),’o’,color=’red’)

Эта строка отображает синусоидальную волну в позиции a-0 с маркером «o» красного цвета. Остальные пять строк также изображают синусоиды с разными маркерами и разными цветами. Есть и другие маркеры, также доступные для использования в Matplotlib, такие как ^, <, + и т. д. При запуске программы выводится изображение, показанное на рисунке 5.

Сохранение графиков Matplotlib

Теперь рассмотрим программу plot5.py, показанную ниже. Она сохранит график, сгенерированный Matplotlib, в заданный выходной формат. Поддерживаемые Matplotlib форматы вывода включают в себя eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, tif, tiff и т. д. Если вы внимательно посмотрите этот список, вы увидите, что выходные форматы Matplotlib включают как растровую, так и векторную графику. Помните, что векторная графика явно превосходит растровую в том, что касается качества изображения, особенно при увеличении до больших размеров. Помимо Matplotlib, PGF/TikZ и PSTricks также могут быть использованы для создания векторной графики. Таким образом, освоение любого из этих инструментов поможет вам создавать изображения хорошего качества, что почти всегда необходимо при публикации в журналах. Программа plot5.py также иллюстрирует некоторые другие необходимые функции Matplotlib, такие как установка меток и заголовка графика.

import matplotlib.pyplot as pt
import numpy as np
a = np.linspace(-10,10,1000)
fig = pt.figure()
pt.title(“Sine Wave”)
pt.xlabel(“a”)
pt.ylabel(“Sine(a)”)
pt.plot(a,np.sin(a),color=’red’)
fig.savefig(‘Image.png’)

Строка кода:

fig = pt.figure( )

…создает новый график. Строка кода:

fig.savefig(‘Image.png’)

…сохраняет график как Image.png. Строка кода:

pt.title(“Sine Wave”)

…задает заголовок графика как Sine Wave. Строки:

pt.xlabel(“a”)

…и:

pt.ylabel(“Sine(a)”)

… установит метки на осях X и Y. При запуске программы plot5.py не будет отображать график на экране, но создаст файл с именем Image.png в том же каталоге, в котором хранится и выполняется программа plot5.py. На рисунке 6 показано изображение Image.png.

Гистограмма и графики рассеяния в Matplotlib

Рисунок 7: Гистограмма и графики рассеяния в Matplotlib

Гистограммы и графики рассеяния в Matplotlib

Рассмотрим программу plot6.py, показанную ниже, которая нарисует гистограмму и график рассеяния с использованием Matplotlib:

import matplotlib.pyplot as pt
import numpy as np
a = np.random.randn(1000)
b = np.random.randn(100)
c = np.random.randn(100)
pt.subplot(2,1,1)
pt.hist(a,color=’green’)
pt.subplot(2,1,2)
pt.scatter(b,c,marker=’o’,color=’red’)
pt.show( )

Строка кода:

a = np.random.randn(1000)

… генерирует 1000 случайных чисел и сохраняет их в переменной «a». Точно так же следующие две строки кода генерируют по 100 случайных чисел каждая и сохраняют их в переменных «b» и «c». Эта программа также использует два вспомогательных графика, которые мы видели ранее. Строка кода:

pt.hist(a,color=’green’)

… строит зеленую гистограмму, используя числа в переменной «a». Строка кода:

pt.scatter(b,c,marker=’o’,color=’red’)

… строит график рассеяния с числами, хранящимися в переменных «b» и «c». При запуске программы plot6.py выдаст изображение, показанное на рисунке 7.

Хотя здесь не был затронут ряд важных тем, таких как 3D-графики с использованием Matplotlib, наборы инструментов Matplotlib и т. д., я уверен, что это введение побудит исследователей и специалистов принять Matplotlib в качестве мощного инструмента для научной визуализации данных. Ранее, когда мы обсуждали различные выходные форматы Matplotlib, мы столкнулись с форматом pgf. Это формат, с помощью которого Matplotlib предоставляет код PGF/TikZ для LaTeX. Итак, в следующей статье этой серии о графической визуализации научных данных мы обсудим PGF/TikZ, еще один мощный инструмент графической визуализации.


Подробное описание библиотеки matplotlib вы найдете в большом обзоре John Hunter, Michael Droettboom, "Библиотека matplotlib"

Другие статьи о математическом ПО в Linux: