Есть много вариантов создания трехмерных графиков на python, здесь я объясню некоторые из наиболее распространенных с использованием Matplotlib. Как правило, первым шагом является создание трехмерных осей, а затем построение любых трехмерных графиков, которые лучше всего иллюстрируют данные для конкретной потребности.

Чтобы использовать Matplotlib, необходимо импортировать набор инструментов mplot3d, включенный в установку Matplotlib:

from mpl_toolkits import mplot3d

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

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection=’3d’)

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

Точки и линии:

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

ax = plt.axes(projection=’3d’)
# Data for a three-dimensional line
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, ‘gray’)
# Data for three-dimensional scattered points
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap=’Greens’);

Контурные 3D-графики.

Входные данные для контурного графика немного отличаются от данных для предыдущих графиков, так как для этого нужны данные в двухмерной сетке, обратите внимание на следующий пример, что после присвоения значений для x и y они объединяются в сетке, выполняя команду « np.meshgrid (x, y) ”, а затем значения Z создаются в результате выполнения функции f (X, Y) со значениями сетки (Z = f (X, Y)).

def f(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 = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

Каркасы:

Этот тип графика также работает с данными в сетке, обратите внимание, что он принимает переменные X, Y, Z, которые мы создали выше, которые представляют собой сетку.

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')

Участок поверхности:

Подобно каркасу, но имеет заливку на гранях.

ax = plt.axes(projection=’3d’)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap=’viridis’,edgecolor=’none’)

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

Триангуляция поверхности:

theta = 2 * np.pi * np.random.random(1000)
r = 6 * np.random.random(1000)
x = np.ravel(r * np.sin(theta))
y = np.ravel(r * np.cos(theta))
z = f(x, y)
ax = plt.axes(projection=’3d’)
ax.plot_trisurf(x, y, z,cmap=’viridis’, edgecolor=’none’);

В этой публикации есть материалы из Руководства по науке о данных Python Джейка Вандерпласа; Блокноты Jupyter доступны на GitHub.

The text is released under the CC-BY-NC-ND license, and code is released under the MIT license. Some of the content was consulted on this book