Вступление
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
По сути, эта среда построения позволяет нам сохранять фигуры и их
атрибуты в качестве переменных. Затем эти графики можно распечатать и
просмотреть с помощью простой команды. Например, мы можем посмотреть на
np.datetime64
акций Google: в частности, дату , открытие ,
закрытие , объем и скорректированную цену закрытия (дата
сохраняется как 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 - 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]
Построение точечной диаграммы
Чтобы построить график этих данных, вы можете использовать функции
matplotlib.pyplot
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()
{.ezlazyload .img-responsive}
Затем мы создаем метки для осей x и y , а также заголовок для графика. Мы решили построить эти данные с помощью сеток и плотного макета.
plt.show()
отображает нам график.
Добавление линии
Мы можем добавить линию к этому Line2D
предоставив координаты 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()
{.ezlazyload .img-responsive}
Построение гистограмм
Чтобы построить гистограмму, мы следуем аналогичному процессу и
используем функцию hist()
pyplot
. Мы сгенерируем 10000 случайных
точек данных, x , со средним значением 100 и стандартным отклонением
15.
Функция hist
принимает данные, x , количество интервалов и другие
аргументы, такие как плотность , которая нормализует данные до
плотности вероятности, или альфа , которая устанавливает прозрачность
гистограммы.
Мы также будем использовать библиотеку 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()
{.ezlazyload .img-responsive}
Гистограммы
В то время как гистограммы помогли нам с визуальной плотностью,
гистограммы помогают нам просматривать количество данных. Чтобы
построить гистограмму с помощью 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()
{.ezlazyload .img-responsive}
Построение изображений
Анализ изображений очень распространен в 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()
{.ezlazyload .img-responsive} {.ezlazyload .img-responsive} {.ezlazyload .img-responsive} {.ezlazyload .img-responsive} {.ezlazyload .img-responsive}
Заключение
В этом посте мы увидели краткое введение в то, как использовать matplotlib для построения данных на диаграммах разброса, гистограммах и гистограммах. Мы также добавили линии к этим графикам. Наконец, мы увидели, как читать изображения с помощью библиотеки cv2, и использовали matplotlib для построения изображений.