- Matplotlib. Урок 5. Построение 3D графиков. Работа с mplot3d Toolkit
- Линейный график
- Точечный график
- Каркасная поверхность
- Поверхность
- P.S.
- Matplotlib. Урок 5. Построение 3D графиков. Работа с mplot3d Toolkit : 2 комментария
- The mplot3d toolkit#
- Line plots#
- Scatter plots#
- Wireframe plots#
- Surface plots#
- Tri-Surface plots#
- Contour plots#
- Filled contour plots#
- Polygon plots#
- Bar plots#
- Quiver#
- 2D plots in 3D#
- Text#
- Как строить трехмерные графики
Matplotlib. Урок 5. Построение 3D графиков. Работа с mplot3d Toolkit
До этого момента все графики, которые мы строили были двумерные, Matplotlib позволяет строить 3D графики. Этой теме посвящен данный урок.
Импортируем необходимые модули для работы с 3D :
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
В библиотеке доступны инструменты для построения различных типов графиков. Рассмотрим некоторые из них более подробно.
Линейный график
Для построения линейного графика используется функция plot().
Axes3D.plot(self, xs, ys, *args, zdir=’z’, **kwargs)
- xs : 1D массив
- x координаты.
- y координаты.
- z координаты. Если передан скаляр, то он будет присвоен всем точкам графика.
- Определяет ось, которая будет принята за z направление, значение по умолчанию: ‘z’ .
- Дополнительные аргументы, аналогичные тем, что используются в функции plot() для построения двумерных графиков.
x = np.linspace(-np.pi, np.pi, 50) y = x z = np.cos(x) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot(x, y, z, label='parametric curve')
Точечный график
Для построения точечного графика используется функция scatter() .
Axes3D.scatter(self, xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True, *args, **kwargs)
- xs, ys : массив
- Координаты точек по осям x и y .
- Координаты точек по оси z . Если передан скаляр, то он будет присвоен всем точкам графика. Значение по умолчанию: 0.
- Определяет ось, которая будет принята за z направление, значение по умолчанию: ‘z’
- Размер маркера. Значение по умолчанию: 20.
- Цвет маркера. Возможные значения:
- Строковое значение цвета для всех маркеров.
- Массив строковых значений цвета.
- Массив чисел, которые могут быть отображены в цвета через функции cmap и norm .
- 2D массив, элементами которого являются RGB или RGBA .
- Затенение маркеров для придания эффекта глубины.
- Дополнительные аргументы, аналогичные тем, что используются в функции scatter() для построения двумерных графиков.
np.random.seed(123) x = np.random.randint(-5, 5, 40) y = np.random.randint(0, 10, 40) z = np.random.randint(-5, 5, 40) s = np.random.randint(10, 100, 20) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z, s=s)
Каркасная поверхность
Для построения каркасной поверхности используется функция plot_wireframe() .
plot_wireframe(self, X, Y, Z, *args, **kwargs)
- X, Y, Z: 2D массивы
- Данные для построения поверхности.
- Максимальное количество элементов каркаса, которое будет использовано в каждом из направлений. Значение по умолчанию: 50.
- Параметры определяют величину шага, с которым будут браться элементы строки / столбца из переданных массивов. Параметры rstride , cstride и rcount , ccount являются взаимоисключающими.
- Дополнительные аргументы, определяемые Line3DCollection .
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] x = np.cos(u)*np.sin(v) y = np.sin(u)*np.sin(v) z = np.cos(v) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_wireframe(x, y, z) ax.legend()
Поверхность
Для построения поверхности используйте функцию plot_surface().
plot_surface(self, X, Y, Z, *args, norm=None, vmin=None, vmax=None, lightsource=None, **kwargs)
- X, Y, Z : 2D массивы
- Данные для построения поверхности.
- см. rcount , ccount в “Каркасная поверхность“.
- см. rstride , cstride в “Каркасная поверхность“.
- Цвет для элементов поверхности.
- Colormap для элементов поверхности.
- Индивидуальный цвет для каждого элемента поверхности.
- Нормализация для colormap .
- Границы нормализации.
- Использование тени для facecolors . Значение по умолчанию: True.
- Объект класса LightSource – определяет источник света, используется, только если shade = True .
- Дополнительные аргументы, определяемые Poly3DCollection .
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] x = np.cos(u)*np.sin(v) y = np.sin(u)*np.sin(v) z = np.cos(v) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(x, y, z, cmap='inferno') ax.legend()
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Matplotlib. Урок 5. Построение 3D графиков. Работа с mplot3d Toolkit : 2 комментария
The mplot3d toolkit#
This tutorial showcases various 3D plots. Click on the figures to see each full gallery example with the code that generates the figures.
3D Axes (of class Axes3D ) are created by passing the projection=»3d» keyword argument to Figure.add_subplot :
import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(projection='3d')
Multiple 3D subplots can be added on the same figure, as for 2D subplots.
Changed in version 3.2.0: Prior to Matplotlib 3.2.0, it was necessary to explicitly import the mpl_toolkits.mplot3d module to make the ‘3d’ projection to Figure.add_subplot .
See the mplot3d FAQ for more information about the mplot3d toolkit.
Line plots#
See Axes3D.plot for API documentation.
Scatter plots#
See Axes3D.scatter for API documentation.
Wireframe plots#
See Axes3D.plot_wireframe for API documentation.
Surface plots#
See Axes3D.plot_surface for API documentation.
Tri-Surface plots#
See Axes3D.plot_trisurf for API documentation.
Contour plots#
See Axes3D.contour for API documentation.
Filled contour plots#
See Axes3D.contourf for API documentation.
New in version 1.1.0: The feature demoed in the second contourf3d example was enabled as a result of a bugfix for version 1.1.0.
Polygon plots#
Bar plots#
See Axes3D.bar for API documentation.
Quiver#
See Axes3D.quiver for API documentation.
2D plots in 3D#
Text#
See Axes3D.text for API documentation.
Как строить трехмерные графики
Следующим шагом мы с вами рассмотрим возможности построения трехмерных графиков в пакете matplotlib. Такая возможность появилась, начиная с версии 0.99, поэтому убедитесь, что ваш пакет поддерживает трехмерные графики.
Все дополнительные классы для работы в 3D находятся в модуле:
и вначале мы его импортируем в нашу программу наряду с самим пакетом matplotlib и numpy:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
А, затем, создадим трехмерную систему координат:
fig = plt.figure(figsize=(7, 4)) ax_3d = Axes3D(fig) plt.show()
При выполнении этой простой программы, мы в окне увидим три пространственные оси, которые можно вращать с помощью курсора мышки:
Того же самого результат можно добиться, используя параметр projection при создании системы координат:
fig = plt.figure(figsize=(7, 4)) ax_3d = fig.add_subplot(projection='3d')
Как именно создавать трехмерные оси, зависит от вашего выбора и удобства при написании конкретных программ. Я остановлюсь на втором способе.
- plot() – линейный 2D график в трех измерениях;
- step() – ступенчатый 2D график в трех измерениях;
- scatter() – точеный график 3D график.
- plot_wireframe() – построение каркасной поверхности в 3D;
- plot_surface() – построение непрерывной 3D поверхности.
x = np.linspace(0, 10, 50) z = np.cos(x) ax_3d.plot(x, x, z)
То есть, мы здесь по координатам x, y выбираем одни и те же значения, а координата z (вертикаль) – это значение функции. Давайте подпишем оси, чтобы видеть, где какая расположена на этом графике:
ax_3d.set_xlabel('x') ax_3d.set_ylabel('y') ax_3d.set_zlabel('z')
Но то, что мы получили, это не совсем трехмерный график. Скорее, это двумерная косинусоида в трех измерениях. Давайте построим настоящее трехмерное изображение, например, вот такой функции:
Первое, что нам здесь нужно сделать – это сформировать двумерную сетку координат по осям x и y:
То есть, должны быть сформированы двумерные массивы x, y, которые для текущей точки с индексами (i, j) возвращают ее координаты в плоскости xy. Для регулярных сеток эти массивы можно сформировать следующим образом. Определим множество координат x (для столбцов) и y (для строк), например, так:
xgrid, ygrid = np.meshgrid(x, y)
На выходе получим двумерные массивы со значениями: То есть, смотрите, теперь для любой пары индексов (i, j) мы легко сможем получить координаты точки в плоскости xy:
(xgrid[1, 2], ygrid[1, 2]) = (3, 5) (xgrid[3, 0], ygrid[3, 0]) = (1, 8)
Но зачем было так все усложнять? Почему бы не использовать одномерные массивы x, y вместо двумерных xgrid, ygrid? Дело в том, что одномерные массивы, которые описывают расположение строк и столбов, могут формировать только регулярные сетки, то есть, прямоугольные. А что, если нужно сформировать гексагональную сетку, которая выглядит, следующим образом: Здесь уже не получится обойтись указанными одномерными массивами, а нужно прописывать узлы двумерными массивами. Именно поэтому, в общем случае, и реализовано отображение через двумерные массивы трехмерных графиков. Итак, давайте теперь построим полноценный трехмерный график синусоиды на регулярной сетке. Для этого мы сначала сформируем координаты узлов в плоскости xy:
x = np.arange(-2*np.pi, 2*np.pi, 0.2) y = np.arange(-2*np.pi, 2*np.pi, 0.2) xgrid, ygrid = np.meshgrid(x, y)
zgrid = np.sin(xgrid) * np.sin(ygrid) / (xgrid * ygrid)
ax_3d.plot_wireframe(xgrid, ygrid, zgrid)
то результат будет следующий: Как видите, мы получили полноценный каркасный трехмерный график синусоиды. Или же можно построить полноценную поверхность в виде синусоиды, используя функцию plot_surface():
ax_3d.plot_surface(xgrid, ygrid, zgrid)
Фактически, только этим две эти функции и отличаются друг от друга: первая строит 3D-каркас, а вторая 3D-поверхность. У этих функций есть следующие параметры для настройки внешнего вида графика:
Параметр Описание x, y, z 2D массивы для построения трехмерных графиков. rcount, ccount Максимальное число элементов каркаса по координатам x и y (по умолчанию 50). rstride, cstride Величина шага, с которым будут выбираться элементы из массивов x, y (параметры rstride, cstride и rcount, ccount – взаимоисключающие). color Цвет графика cmap Цветовая карта графика Например, если установить параметры:
ax_3d.plot_surface(xgrid, ygrid, zgrid, rstride=5, cstride=5, cmap='plasma')
то получим следующий вид нашей синусоиды: В заключение этого занятия приведу пример построения этого же графика набором точек, используя функцию scatter():
ax_3d.scatter(xgrid, ygrid, zgrid, s=1, color='g')
Увидим следующий результат: Вот так в базовом варианте можно выполнять построения трехмерных графиков в пакете matplotlib. Этой информации достаточно для большинства прикладных задач. Ну а если потребуется реализовать что-то особенное, тогда прямой путь к документации: https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html