Python поверхность по точкам

Matplotlib. Урок 5. Построение 3D графиков. Работа с mplot3d Toolkit

Follow us on Google Plus Follow us on rss

До этого момента все графики, которые мы строили были двумерные, 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.

            ../../_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.

            Источник

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

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

            Источник

            Читайте также:  Java in practice book
Оцените статью