Введение в визуализацию данных с Matplotlib

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

Matplotlib — библиотека на языке программирования Python для визуализации данных двумерной (2D) графикой (3D графика также поддерживается). Получаемые изображения могут быть использованы в качестве иллюстраций в публикациях[4].

Matplotlib написан и поддерживался в основном Джоном Хантером (англ. John Hunter) и распространяется на условиях BSD-подобной лицензии. Генерируемые в различных форматах изображения могут быть использованы в интерактивной графике, в научных публикациях, графическом интерфейсе пользователя, веб-приложениях, где требуется построение диаграмм (англ. plotting)[5][6]. В документации автор признаётся, что Matplotlib начинался с подражания графическим командам MATLAB, но является независимым от него проектом

Веб-сайт: http://matplotlib.org/

Установка

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

conda install matplotlib

или

pip install matplotlib

Импорт

import matplotlib.pyplot as plt

Для отображения графиков в notebook'е введите

%matplotlib inline

Благодаря этой строчке все графики будут выводиться в векторном формате svg:

%config InlineBackend.figure_format = 'svg'

Для отображения графиков в отрыве от jupyter notebook используйте plt.show() после всех команд для вывода графиков.

API matplotlib в функциональном стиле

Example

В отличии от pandas, matplotlib может строить графики из обычных списков или массивов numpy.

** Создадим массив numpy:**

import numpy as np
x = np.linspace(0, 5, 11)
y = x**2
x
array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])
y
array([ 0. , 0.25, 1. , 2.25, 4. , 6.25, 9. , 12.25, 16. ,
20.25, 25. ])

Базовые комманды matplotlib

plt.plot(x, y, 'r')  #  r - значит red
plt.xlabel('Ось X')
plt.ylabel('Ось Y')
plt.title('Заголовок графика')
plt.show();

Несколько графиков на одном полотне

# plt.subplot(nrows, ncols, plot_number)
plt.subplot(1, 2, 1)
plt.plot(x, y, 'r--')  #  Магия
plt.subplot(1, 2, 2)
plt.plot(y, x, 'g*-');

Объектно-ориентированный стиль создания графиков

# Create Figure (empty canvas)
fig = plt.figure()

# Add set of axes to figure
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # left, bottom, width, height (range 0 to 1)

# Plot on that set of axes
axes.plot(x, y, 'b')
axes.set_xlabel('Ось X') # Notice the use of set_ to begin methods
axes.set_ylabel('И ось Y')
axes.set_title('Заголовок все там же');

Теперь мы имеем полный контроль над осями графика:

# Создадим пустое полотно
fig = plt.figure()

# Оси задаются через список из 4-х чисел: координаты левого нижнего угла, ширина и высота.
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3])

axes1.plot(x, y, 'b')
axes1.set_xlabel('Подпись оси X большого графика')
axes1.set_ylabel('Подпись оси Y большого графика')
axes1.set_title('Заголовок большого графика')

axes2.plot(y, x, 'r')
axes2.set_xlabel('Подпись оси X\nмалого графика')
axes2.set_ylabel('Подпись оси Y\nмалого графика')
axes2.set_title('Заголовок малого графика');

subplots()

То же, что и plt.figure(), только возвращяет сразу кортеж с фигурой и осями:

fig, axes = plt.subplots()

axes.plot(x, y, 'r')
axes.set_xlabel('x')
axes.set_ylabel('y')
axes.set_title('Заголовок')
Text(0.5, 1.0, 'Заголовок')

Если указать количество строк и столбцов, можно создать несколько графиков.

# Два пустых графика
fig, axes = plt.subplots(nrows=1, ncols=2)
# Axes — это просто список осей
axes
array([,
],
dtype=object)

We can iterate through this array:

for ax in axes:
    ax.plot(x, y, 'b')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_title('Заголовок')

fig

При построении несколько графиков оси часто накладываются друг на друга. Для утранения этой проблемы используйте методы fig.tight_layout() или plt.tight_layout():

fig, axes = plt.subplots(nrows=1, ncols=2)

for ax in axes:
    ax.plot(x, y, 'g')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_title('Заголовок')

fig    
plt.tight_layout()

Figure size, aspect ratio and DPI

Matplotlib позволяет задавать размер сторон графика и DPI при созданни фигуры. Для этого используйте следующие именованные аргументы:

  • figsize принимает кортеж и двух чисел — ширины и высоты графика в дюймах.
  • dpi — dots-per-inch.

Например:

fig = plt.figure(figsize=(8,4), dpi=100)

То же самое можно передать в subplots.

fig, axes = plt.subplots(figsize=(12,3), dpi=300)

axes.plot(x, y, 'r')
axes.set_xlabel('x')
axes.set_ylabel('y')
axes.set_title('Заголовок');

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

Можно сохранять графики в форматах PNG, JPG, EPS, SVG, PGF и PDF.

Для сохранения графика надо использовать метод savefig класса Figure:

fig.savefig("filename.png", dpi=200)

Легенды, подписи осей, заголовки

Заголовки графиков

ax.set_title("Заголовок");

Подписи осей

ax.set_xlabel("x")
ax.set_ylabel("y");

Легенды

При построении графиков можно указывать аргумент label="label text", и указанные в нем подписи будут отображаться как подписи легенд и использовании метода legend:

fig = plt.figure()

ax = fig.add_axes([0,0,1,1])

ax.plot(x, x**2, label="x**2")
ax.plot(x, x**3, label="x**3")

ax.legend();

Легенду можно располагать в различных местах графиков, подробнее в документации.

ax.legend(loc=1)  # upper right
ax.legend(loc=2)  # upper left
ax.legend(loc=3)  # lower left
ax.legend(loc=4)  # lower right

ax.legend(loc=0)  # оптимальное местоположение
fig

Установка цвета, толщины и типа линий

Стиль MatLab

fig, ax = plt.subplots()
ax.plot(x, x**2, 'b.-')  # Синяя линяя, точка пунктир
ax.plot(x, x**3, 'g--');  # Зелёна пунктирная линия

Указание цветов в параметре color= и alpha

fig, ax = plt.subplots()

ax.plot(x, x+1, color="blue", alpha=0.5) # Полупрозрачная линия
ax.plot(x, x+2, color="#8B008B")        # RGB
ax.plot(x, x+3, color="#FF8C00");        # RGB

Стили линии и маркеров

Для изменения толщины линии используется ключевое слово linewidth или lw. Стиль линии задаётся аргументами linestyle или ls:

fig, ax = plt.subplots(figsize=(12,6))

ax.plot(x, x+1, color="red", linewidth=0.25)
ax.plot(x, x+2, color="red", linewidth=0.50)
ax.plot(x, x+3, color="red", linewidth=1.00)
ax.plot(x, x+4, color="red", linewidth=2.00)

# Возможные варианты ‘-‘, ‘–’, ‘-.’, ‘:’, ‘steps’
ax.plot(x, x+5, color="green", lw=3, linestyle='-')
ax.plot(x, x+6, color="green", lw=3, ls='-.')
ax.plot(x, x+7, color="green", lw=3, ls=':')

# Кастомная пунктирная линия
line, = ax.plot(x, x+8, color="black", lw=1.50)
line.set_dashes([5, 10, 15, 10]) # формат: длина линия, длина пропуска, ...

# Возможные маркеры: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
ax.plot(x, x+ 9, color="blue", lw=3, ls='-', marker='+')
ax.plot(x, x+10, color="blue", lw=3, ls='--', marker='o')
ax.plot(x, x+11, color="blue", lw=3, ls='-', marker='s')
ax.plot(x, x+12, color="blue", lw=3, ls='--', marker='1')

# Размер и цвет маркеров
ax.plot(x, x+13, color="purple", lw=1, ls='-', marker='o', markersize=2)
ax.plot(x, x+14, color="purple", lw=1, ls='-', marker='o', markersize=4)
ax.plot(x, x+15, color="purple", lw=1, ls='-', marker='o', markersize=8, markerfacecolor="red")
ax.plot(x, x+16, color="purple", lw=1, ls='-', marker='s', markersize=8, 
        markerfacecolor="yellow", markeredgewidth=3, markeredgecolor="green");

Диапазон значений графика

Диапазон можно изменять при помощи методов set_ylim, set_xlim и axis('tight') :

fig, axes = plt.subplots(1, 3, figsize=(12, 4))

axes[0].plot(x, x**2, x, x**3)
axes[0].set_title("Стандартный диапазон осей")

axes[1].plot(x, x**2, x, x**3)
axes[1].axis('tight')
axes[1].set_title("«Тесные» оси")

axes[2].plot(x, x**2, x, x**3)
axes[2].set_ylim([0, 60])
axes[2].set_xlim([2, 5])
axes[2].set_title("Заданный точными значениями\nдиапазон осей");

Другие типы графиков

При помощи matplotlib можно создавать барплоты, гистограммы, точечные диаграммы и много ещё чего. Намного проще создавать из с использованием seaborn, но можно обойтись и чистым matplotlib:

plt.scatter(x,y)
from random import sample
data = sample(range(1, 1000), 100)
plt.hist(data);
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# rectangular box plot
plt.boxplot(data,vert=True,patch_artist=True);   

Материалы для самостоятельного изучения

Задачи для самостоятельного решения

Загрузим необходимые библиотеки и подготовим данные:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(0,100)
y = x*2
z = x**2

Задача 1

** Выполните следующие шаги: **

  • ** Создайте объект класса Figure используя метод plt.figure() **
  • ** Используйте add_axes чтобы добавить оси, занимающие все полотно фигуры.**
  • ** Изобразите на полученном графике связь между x и y, чтобы получился похожий результат:**

Советую выполнять Ваш код в отдельной ячейке, для того, чтобы не стереть образец.

Text(0.5, 1.0, 'Заголовок')

Задача 2

Создайте на одном полотне две пары осей, чтобы получилась похожая картинка:

Визуализируйте данные на каждой паре осей

Напишите код, чтобы получить похожие графики:

Comments