Python построение трехмерных графиков

3-Мерные графики в Python с использованием Matplotlib

Как и 2-мерные графики, вы также можете создавать 3-мерные графики в Python с помощью matplotlib. В этом уроке мы узнаем, как строить трехмерные графики с помощью matplotlib.

Как построить трехмерные графики в Python?

Мы будем использовать инструментарий mplot3d вместе с библиотекой matplotlib . Инструментарий mplot3d построен на базе библиотеки matplotlib, чтобы упростить создание трехмерных графиков.

Так что без дальнейших задержек, давайте начнем!

1. Импортируйте необходимые модули

Для начала мы импортируем matplotlib и инструментарий mplot3d . Наряду с этими двумя, мы также импортируем numpy для создания образцов данных. Код для импорта этих трех приведен ниже.

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt

2. Создайте трехмерные оси

Теперь мы можем создавать трехмерные оси, используя импортированные модули .

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') plt.show()

Оси

Теперь, когда у нас есть топоры, давайте попробуем что-нибудь придумать. При построении графика нам нужно убедиться,что мы предоставляем значения для всех трех осей ( x, y и z).

В следующих разделах мы узнаем, как сделать спираль, используя синусоидальные функции(синус и косинус).

Перед этим мы узнаем, как добавить заголовок к сюжету.

3. Добавление заголовка к сюжету

Вы можете добавить заголовок к своим участкам с помощью метода set_title():

ax.set_title('Learning about 3D plots')

Чтобы увидеть приведенную выше строку кода в действии, выполните следующие действия:

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #set title ax.set_title('Learning about 3D plots') plt.show()

Участок С Названием

4. Создайте спираль

Для создания спирали мы будем использовать функцию синуса вдоль оси x и функцию косинуса вдоль оси y.

Точки данных для спирали могут быть сгенерированы следующим образом:

z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z)

Здесь функция np.linspace дает 1000 точек с равным расстоянием между 0 и 15.

Полный код выглядит следующим образом:

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #cordiates for spiral z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z) ax.plot3D(x, y, z, 'red') plt.show()

Спиральный

5. Измените угол обзора

Трехмерные графики выглядят по-разному в зависимости от угла обзора. Вы можете изменить угол обзора трехмерных графиков с помощью метода view_init():

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #cordiates for spiral z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z) ax.plot3D(x, y, z, 'red') ax.view_init(60, 50) plt.show()

Изменение Угла Обзора

Здесь мы упоминаем два аргумента: высоту и угол наклона осей(в градусах).

Читайте также:  Движение объекта в python

Давайте попробуем под другим углом.

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #cordiates for spiral z = np.linspace(0, 15, 1000) x = np.sin(z) y = np.cos(z) ax.plot3D(x, y, z, 'red') ax.view_init(120, 90) plt.show()

Пример 2

6. Построение каркаса из проволоки

Вы можете построить трехмерный каркас с помощью метода plot_wireframe (), как показано в приведенном ниже примере:

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #function for Z values def f(x, y): return np.cos(np.sqrt(x ** 2 + y ** 2)) # x and y values x = np.linspace(1, 10, 10) y = np.linspace(1, 10, 10) X, Y = np.meshgrid(x, y) Z = f(X, Y) ax = plt.axes(projection ='3d') ax.plot_wireframe(X, Y, Z, color ='red') plt.show()

Каркасный

Здесь функция np.meshgrid создает матрицы координат из векторов координат.

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

7. Создайте поверхностный участок

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

from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt #create 3d axes fig = plt.figure() ax = plt.axes(projection='3d') #function for Z values def f(x, y): return np.cos(np.sqrt(x ** 2 + y ** 2)) # x and y values x = np.linspace(1, 10, 10) y = np.linspace(1, 10, 10) X, Y = np.meshgrid(x, y) Z = f(X, Y) ax = plt.axes(projection ='3d') ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis') plt.show()

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

Здесь следующие аргументы означают следующее:

шаг Шаг строки массива (размер шага)
cstrike Шаг столбца массива (размер шага)
лагерь Цветовая карта для участков поверхности.

Вывод

В этом уроке речь шла о трехмерных графиках на Python. Мы научились строить трехмерные оси вместе с точками данных. Чтобы узнать больше о трехмерных фигурах в mplot3d, обратитесь к их официальной документации.

Читайте ещё по теме:

Источник

Как строить трехмерные графики

Следующим шагом мы с вами рассмотрим возможности построения трехмерных графиков в пакете 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()

При выполнении этой простой программы, мы в окне увидим три пространственные оси, которые можно вращать с помощью курсора мышки:

Читайте также:  Php дата по гринвичу

Того же самого результат можно добиться, используя параметр 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-поверхность. У этих функций есть следующие параметры для настройки внешнего вида графика:

Читайте также:  vertical-align
Параметр Описание
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

Источник

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.

../../_images/sphx_glr_subplot3d_001.png

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.

../../_images/sphx_glr_lines3d_001.png

Scatter plots#

See Axes3D.scatter for API documentation.

../../_images/sphx_glr_scatter3d_001.png

Wireframe plots#

See Axes3D.plot_wireframe for API documentation.

../../_images/sphx_glr_wire3d_001.png

Surface plots#

See Axes3D.plot_surface for API documentation.

../../_images/sphx_glr_surface3d_001.png

Tri-Surface plots#

See Axes3D.plot_trisurf for API documentation.

../../_images/sphx_glr_trisurf3d_001.png

Contour plots#

See Axes3D.contour for API documentation.

../../_images/sphx_glr_contour3d_001.png

Filled contour plots#

See Axes3D.contourf for API documentation.

../../_images/sphx_glr_contourf3d_001.png

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#

../../_images/sphx_glr_polys3d_001.png

Bar plots#

See Axes3D.bar for API documentation.

../../_images/sphx_glr_bars3d_001.png

Quiver#

See Axes3D.quiver for API documentation.

../../_images/sphx_glr_quiver3d_001.png

2D plots in 3D#

../../_images/sphx_glr_2dcollections3d_001.png

Text#

See Axes3D.text for API documentation.

Источник

Оцените статью