Библиотека сайта 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 и другие мультимедийные компоненты в один исполняемый документ.
Рисунок 1: логотип 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, обсуждаемые в этой статье, можно загрузить с
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
Рисунок 3: Функции синус и косинус в 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: Цвета и маркеры на графиках
Рисунок 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.
Рисунок 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:
- Визуализация научных данных с помощью пакета matplotlib в Linux
- Использование NumPy для научных расчетов в Linux
- Математика в GNU / Linux
- Альтернативы Matlab для Linux
- Создание фракталов в PDL