Есть много вариантов создания трехмерных графиков на 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