Рубрики
Без рубрики

Краткое введение в matplotlib для визуализации данных

Автор оригинала: Guest Contributor.

Вступление

Python имеет широкий спектр полезных пакетов для машинного обучения и статистического анализа, таких как TensorFlow , NumPy , scikit-learn , Pandas и многое другое. Одним из пакетов, который необходим для большинства проектов в области науки о данных, является matplotlib .

Доступный для любого дистрибутива Python, он может быть установлен на Python 3 с помощью pip . Другие методы также доступны, проверьте https://matplotlib.org/ для получения более подробной информации.

Установка

Если вы используете ОС с терминалом, следующая команда установит matplotlib с pip:

$ python3 -m pip install matplotlib

Импорт и Окружающая среда

В файле Python мы хотим импортировать функцию pyplot , которая позволяет нам взаимодействовать с графической средой, подобной MATLAB. Мы также импортируем функцию lines , которая позволяет нам добавлять линии на графики:

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

По сути, эта среда построения графиков позволяет нам сохранять фигуры и их атрибуты как переменные. Затем эти графики можно распечатать и просмотреть с помощью простой команды. Например, мы можем посмотреть на цену акций Google: в частности, date , open , close , volume и adjusted close price (дата хранится как np.datetime64 ) за последние 250 дней:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook

with cbook.get_sample_data('goog.npz') as datafile:
    price_data = np.load(datafile)['price_data'].view(np.recarray)
price_data = price_data[-250:] # get the most recent 250 trading days

Затем мы преобразуем данные так, как это часто делается для временных рядов и т. Д. Мы находим разницу, $d_i$ , между каждым наблюдением и предыдущим:

$$d_i – y_{i – 1} $$

delta1 = np.diff(price_data.adj_close) / price_data.adj_close[:-1]

Мы также можем посмотреть на преобразования различных переменных, таких как объем и цена закрытия :

# Marker size in units of points^2
volume = (15 * price_data.volume[:-2] / price_data.volume[0])**2
close = 0.003 * price_data.close[:-2] / 0.003 * price_data.open[:-2]

Построение точечной диаграммы

Чтобы на самом деле построить эти данные, вы можете использовать функции subplots() из plt ( matplotlib.pyplot ). По умолчанию это создает область для фигуры и осей графика.

Здесь мы сделаем точечную диаграмму различий между последовательными днями. Чтобы уточнить, x – это разница между днем i и предыдущим днем. y – это разница между днем i+1 и предыдущим днем ( i ):

fig, ax = plt.subplots()
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)

ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')

ax.grid(True)
fig.tight_layout()

plt.show()

Затем мы создаем метки для осей x и y , а также заголовок для графика. Мы выбираем построение этих данных с помощью сеток и плотной компоновки.

plt.show() отображает сюжет для нас.

Добавление строки

Мы можем добавить линию к этому участку, предоставив координаты x и y в виде списков экземпляру Line2D :

import matplotlib.lines as mlines

fig, ax = plt.subplots()
line = mlines.Line2D([-.15,0.25], [-.07,0.09], color='red')
ax.add_line(line)

# reusing scatterplot code
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)

ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')

ax.grid(True)
fig.tight_layout()

plt.show()

Построение Гистограмм

Чтобы построить гистограмму, мы следуем аналогичному процессу и используем функцию hist() из pyplot . Мы сгенерируем 10000 случайных точек данных, x , со средним значением 100 и стандартным отклонением 15.

Функция hist принимает данные, x , количество ячеек и другие аргументы, такие как density , которая нормализует данные к плотности вероятности, или alpha , которая устанавливает прозрачность гистограммы.

Мы также будем использовать библиотеку mlab для добавления линии, представляющей нормальную функцию плотности с тем же средним и стандартным отклонением:

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma*np.random.randn(10000)

# the histogram of the data
n, bins, patches = plt.hist(x, 30, density=1, facecolor='blue', alpha=0.75)

# add a 'best fit' line
y = mlab.normpdf( bins, mu, sigma)
l = plt.plot(bins, y, 'r--', linewidth=4)

plt.xlabel('IQ')
plt.ylabel('Probability')
plt.title(r'$\mathrm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)

plt.show()

Гистограммы

В то время как гистограммы помогают нам с визуальной плотностью, гистограммы помогают нам просматривать количество данных. Чтобы построить гистограмму с помощью matplotlib, мы используем функцию bar () . Это принимает подсчеты и метки данных как x и y вместе с другими аргументами.

В качестве примера можно привести пример числа программистов, использующих разные языки:

import numpy as np
import matplotlib.pyplot as plt
 
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))
performance = [10,8,6,4,2,1]
 
plt.bar(y_pos, performance, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Usage')
plt.title('Programming language usage')
 
plt.show()

Построение Графиков Изображений

Анализ изображений очень распространен в Python. Неудивительно, что мы можем использовать matplotlib для просмотра изображений. Мы используем библиотеку cv2 для чтения изображений.

Краткое описание функции read_image() приведено ниже:

  • считывает файл изображения
  • разбивает цветовые каналы
  • изменяет их на RGB
  • изменение размера изображения
  • возвращает матрицу значений RGB

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

import matplotlib.pyplot as plt
import numpy as np
import os, cv2

cwd = os.getcwd()
TRAIN_DIR = cwd + '/data/train/'

ROWS = 256
COLS = 256
CHANNELS = 3

train_images = [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR)] # use this for full dataset
train_dogs =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'dog' in i]
train_cats =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'cat' in i]

def read_image(file_path):
    img = cv2.imread(file_path, cv2.IMREAD_COLOR) #cv2.IMREAD_GRAYSCALE
    b,g,r = cv2.split(img)
    img2 = cv2.merge([r,g,b])
    return cv2.resize(img2, (ROWS, COLS), interpolation=cv2.INTER_CUBIC)

for a in range(0,5):
    cat = read_image(train_cats[a])
    dog = read_image(train_dogs[a])
    pair = np.concatenate((cat, dog), axis=1)
    plt.figure(figsize=(10,5))
    plt.imshow(pair)
    plt.show()

Вывод

В этом посте мы увидели краткое введение о том, как использовать matplotlib для построения данных в точечных диаграммах, гистограммах и гистограммах. Мы также добавили линии к этим участкам. Наконец, мы увидели, как читать в изображениях с помощью библиотеки cv2 и использовали matplotlib для построения изображений.