Я пишу информационный бюллетень для учащихся под названием Mighty Knowledge. Каждый новый выпуск содержит ссылки и основные уроки из самого лучшего контента, включая цитаты, книги, статьи, подкасты и видео. Каждый выбран специально для того, чтобы научиться жить более мудрой, счастливой и полной жизнью. Зарегистрируйтесь здесь.

Каждый специалист по данным должен знать, как создавать эффективные визуализации данных. Без визуализации вы застрянете, пытаясь вычислить числа и представить себе тысячи точек данных в своей голове!

Помимо этого, это также важный инструмент для эффективного общения с заинтересованными сторонами, не имеющими технического образования, которым будет легче понять ваши результаты с помощью картинки, а не слов.

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

Но что, если мы сделаем еще один шаг. Двухмерный график может отображать отношения только между одной парой осей x - y; 3D-график, с другой стороны, позволяет нам исследовать отношения 3 пар осей: x - y, x - z и y - z.

В этой статье я дам вам простое введение в мир 3D-визуализации данных с помощью Matplotlib. В конце концов, вы сможете добавить 3D-графики в свой набор инструментов Data Science!

Незадолго до того, как мы начнем, ознакомьтесь с Информационным бюллетенем AI Smart, чтобы прочитать последние и лучшие материалы по ИИ, машинному обучению и науке о данных!

Трехмерные точечные и линейные графики

Трехмерное построение в Matplotlib начинается с включения инструментария утилиты. Мы можем включить этот инструментарий, импортировав библиотеку mplot3d, которая поставляется с вашей стандартной установкой Matplotlib через pip. Просто убедитесь, что ваша версия Matplotlib выше 1.0.

После импорта этого подмодуля можно создавать трехмерные графики, передав ключевое слово projection="3d" любой из обычных функций создания осей в Matplotlib:

from mpl_toolkits import mplot3d

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.axes(projection="3d")

plt.show()

Теперь, когда наши оси созданы, мы можем начать рисовать в 3D. Функции трехмерного построения довольно интуитивно понятны: вместо простого scatter мы вызываем scatter3D, а вместо передачи только данных x и y мы передаем x , y и z. Все остальные настройки функций, такие как цвет и тип линии, остаются такими же, как и для функций 2D-печати.

Вот пример построения 3D-линии и 3D-точек.

fig = plt.figure()
ax = plt.axes(projection="3d")

z_line = np.linspace(0, 15, 1000)
x_line = np.cos(z_line)
y_line = np.sin(z_line)
ax.plot3D(x_line, y_line, z_line, 'gray')

z_points = 15 * np.random.random(100)
x_points = np.cos(z_points) + 0.1 * np.random.randn(100)
y_points = np.sin(z_points) + 0.1 * np.random.randn(100)
ax.scatter3D(x_points, y_points, z_points, c=z_points, cmap='hsv');

plt.show()

Самое замечательное в 3D-графике: интерактивность. Интерактивность графиков становится чрезвычайно полезной для изучения ваших визуализированных данных после того, как вы построили график в 3D. Ознакомьтесь с некоторыми из различных представлений, которые я создал, просто перетащив график!

Поверхностные участки

Графики поверхности отлично подходят для визуализации взаимосвязей между 3 переменными во всем трехмерном ландшафте. Они дают полную структуру и видение того, как значение каждой переменной изменяется по осям двух других.

Построение графика поверхности в Matplotlib - это трехэтапный процесс.

(1) Сначала нам нужно сгенерировать фактические точки, которые будут составлять график поверхности. Теперь создание всех точек трехмерной поверхности невозможно, так как их бесконечное количество! Поэтому вместо этого мы сгенерируем ровно столько, чтобы иметь возможность оценить поверхность, а затем экстраполировали остальные точки. Мы определим точки x и y, а затем вычислим точки z с помощью функции.

fig = plt.figure()
ax = plt.axes(projection="3d")
def z_function(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = z_function(X, Y)

(2) Второй шаг - построить каркас - это наша оценка поверхности.

fig = plt.figure()
ax = plt.axes(projection="3d")
ax.plot_wireframe(X, Y, Z, color='green')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

plt.show()

(3) Наконец, мы спроецируем нашу поверхность на нашу оценку каркаса и экстраполируем все точки.

ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='winter', edgecolor='none')
ax.set_title('surface');

Красота! Вот и наша красочная трехмерная поверхность!

3D гистограммы

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

Каждой полосе на гистограмме всегда нужны 2 вещи: позиция и размер. С помощью трехмерных гистограмм мы собираемся предоставить эту информацию для всех трех переменных x, y, z.

Мы выберем ось z, чтобы закодировать высоту каждой полосы; поэтому каждая полоса начинается с z = 0 и имеет размер, пропорциональный значению, которое мы пытаемся визуализировать. Позиции x и y будут представлять координаты полосы на двухмерной плоскости z = 0. Мы установим x и y размер каждой полосы на значение 1, чтобы все полосы имели одинаковую форму.

Посмотрите код и 3D-графики ниже в качестве примера!

fig = plt.figure()
ax = plt.axes(projection="3d")

num_bars = 15
x_pos = random.sample(xrange(20), num_bars)
y_pos = random.sample(xrange(20), num_bars)
z_pos = [0] * num_bars
x_size = np.ones(num_bars)
y_size = np.ones(num_bars)
z_size = random.sample(xrange(20), num_bars)

ax.bar3d(x_pos, y_pos, z_pos, x_size, y_size, z_size, color='aqua')
plt.show()