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

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

Следующим шагом мы с вами рассмотрим возможности построения трехмерных графиков в пакете matplotlib. Такая возможность появилась, начиная с версии 0.99, поэтому убедитесь, что ваш пакет поддерживает трехмерные графики.

Все дополнительные классы для работы в 3D находятся в модуле:

и вначале мы его импортируем в нашу программу наряду с самим пакетом matplotlib и numpy:

А, затем, создадим трехмерную систему координат:

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Того же самого результат можно добиться, используя параметр projection при создании системы координат:

Как именно создавать трехмерные оси, зависит от вашего выбора и удобства при написании конкретных программ. Я остановлюсь на втором способе.

Начнем с самого простого варианта – функции plot() для рисования косинусоиды в трех измерениях:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

То есть, мы здесь по координатам x, y выбираем одни и те же значения, а координата z (вертикаль) – это значение функции. Давайте подпишем оси, чтобы видеть, где какая расположена на этом графике:

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Первое, что нам здесь нужно сделать – это сформировать двумерную сетку координат по осям x и y:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

То есть, должны быть сформированы двумерные массивы x, y, которые для текущей точки с индексами (i, j) возвращают ее координаты в плоскости xy.

Для регулярных сеток эти массивы можно сформировать следующим образом. Определим множество координат x (для столбцов) и y (для строк), например, так:

А, затем, используя функцию meshgrid() сформируем регулярную сетку на основе этих данных:

На выходе получим двумерные массивы со значениями:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

То есть, смотрите, теперь для любой пары индексов (i, j) мы легко сможем получить координаты точки в плоскости xy:

Но зачем было так все усложнять? Почему бы не использовать одномерные массивы x, y вместо двумерных xgrid, ygrid? Дело в том, что одномерные массивы, которые описывают расположение строк и столбов, могут формировать только регулярные сетки, то есть, прямоугольные. А что, если нужно сформировать гексагональную сетку, которая выглядит, следующим образом:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

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

Итак, давайте теперь построим полноценный трехмерный график синусоиды на регулярной сетке. Для этого мы сначала сформируем координаты узлов в плоскости xy:

А, затем, вычислим значения синусоиды в этих узлах:

Если для вывода такого графика воспользоваться функцией plot_wireframe():

то результат будет следующий:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Фактически, только этим две эти функции и отличаются друг от друга: первая строит 3D-каркас, а вторая 3D-поверхность.

У этих функций есть следующие параметры для настройки внешнего вида графика:

2D массивы для построения трехмерных графиков.

Максимальное число элементов каркаса по координатам x и y (по умолчанию 50).

Величина шага, с которым будут выбираться элементы из массивов x, y (параметры rstride, cstride и rcount, ccount – взаимоисключающие).

Цветовая карта графика

Например, если установить параметры:

то получим следующий вид нашей синусоиды:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

В заключение этого занятия приведу пример построения этого же графика набором точек, используя функцию scatter():

Увидим следующий результат:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

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

Видео по теме

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#1. Установка пакета и основные возможности

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#2. Функция plot для построения и оформления двумерных графиков

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#3. Отображение нескольких координатных осей в одном окне

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#4. Граничные значения осей и локаторы для расположения меток на них

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#5. Настраиваем формат отображения меток у координатных осей

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#6. Делаем логарифмический масштаб у координатных осей

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#7. Размещаем стандартные текстовые элементы на графике

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#8. Добавляем легенду и рисуем геометрические фигуры на графиках

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#9. Рисуем ступенчатые, стековые, stem и точечные графики

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#10. Рисуем гистограммы, столбчатые и круговые диаграммы

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#11. Показ изображений и цветовых сеток

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#13. Рисуем линии уровня функциями contour, contourf и tricontour, tricontourf

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

#14. Создаем анимацию графиков Классы FuncAnimation и ArtistAnimation

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Полный код приведен ниже:

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

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

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

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

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

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

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

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

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

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

Вывод

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

Источник

Многомерные графики в Python — от трёхмерных и до шестимерных

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Введение

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

Plotly — это питоновская библиотека с открытым исходным кодом для разнообразной визуализации, которая предлагает гораздо больше настроек, чем известные matplotlib и seaborn. Модуль устанавливается как обычно — pip install plotly. Его мы и будем использовать для рисования графиков.

Давайте подготовим данные

Для визуализации мы используем простые данные об автомобилях от UCI (Калифорнийский университет в Ирвине — прим. перев.), которые представляют собой 26 характеристик для 205 машин (26 столбцов на 205 строк). Для визуализации шести измерений мы возьмём такие шесть параметров.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Загрузим данные из CSV с помощью pandas.

Теперь, подготовившись, начнем с двух измерений.

Двухмерная диаграмма рассеяния

Диаграмма рассеяния — весьма простой и распространенный график. Из 6 параметров, price и curb-weight используются ниже как Y и X соответственно.

В plotly процесс немного отличен от аналогичного в Matplotlib. Мы должны создать layout и figure, передав их в функцию offline.plot, после чего результат будет сохранён в HTML файл в текущей рабочей директории. Вот скриншот того, что получится. В конце статьи будет ссылка на GitHub репозиторий с готовыми интерактивными HTML-графиками.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Диаграмма рассеяния в 3D

Мы можем добавить третий параметр horsepower (количество лошадиных сил) на ось Z. Plotly предоставляет функцию Scatter3D для построения интерактивных трёхмерных графиков.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Вместо того чтобы вставлять код сюда каждый раз, я добавлял его в репозиторий.

(Удобнее всего смотреть релевантный код в соседней вкладке параллельно со чтением — прим. перев.)

Добавление четвёртого измерения

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

Здесь, наряду с тремя предыдущими характеристиками, мы будем использовать пробег в городских условиях — city-mpg как четвертое измерение, за которое будет отвечать параметр markercolor функции Scatter3D. Более светлый оттенок маркера будет означать меньший пробег.

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Добавление пятого измерения

Размер маркера можно использовать для визуализации 5-го измерения. Мы используем характеристику engine-size (размер двигателя) для параметра markersize функции Scatter3D.

Наблюдения: размер двигателя связан с некоторыми из предыдущих параметров. Чем выше цена, тем больше двигатель. Ра́вно как и: ниже пробег — больше двигатель.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Добавление шестого измерения

Форма маркера отлично подходит для визуализации категорий. Plotly даёт на выбор 10 различных фигур для 3D графика (звёздочка, круг, квадрат и т.д.). Таким образом, в качестве формы можно показать до 10 различных значений.

У нас есть характеристика num-of-doors, которая содержит целые числа — количество дверей (2 или 4). Преобразуем эти значения в фигуры: квадрат для 4 дверей, круг для 2 дверей. Используется параметр markersymbol функции Scatter3D.

Наблюдения: такое чувство, что у всех самых дешёвых машин по 4 двери (круги). Продолжая изучать график, можно будет сделать больше предположений и выводов.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

6D график с формой маркера в качестве шестого измерения (количество дверей)

Можем ли мы добавить больше измерений?

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

Исходный код

Код на Python и интерактивные графики для всех фигур доступны на GitHub здесь.

Источник

Построить трехмерный график по точкам

Трехмерные графики функции

Чтобы создать трехмерный график достаточно, чтобы в выражении была переменная y (например, y^2-x/3 ).

Чтобы создать трехмерный график достаточно, чтобы в выражении была переменная y (например, y^2-x/3 ).

Принципы и способы построения графика функции

Прикладное применение графика функции

Построить пирамиду ABCD по координатам можно здесь.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Введение

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

Plotly — это питоновская библиотека с открытым исходным кодом для разнообразной визуализации, которая предлагает гораздо больше настроек, чем известные matplotlib и seaborn. Модуль устанавливается как обычно — pip install plotly. Его мы и будем использовать для рисования графиков.

Давайте подготовим данные

Для визуализации мы используем простые данные об автомобилях от UCI (Калифорнийский университет в Ирвине — прим. перев.), которые представляют собой 26 характеристик для 205 машин (26 столбцов на 205 строк). Для визуализации шести измерений мы возьмём такие шесть параметров.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Загрузим данные из CSV с помощью pandas.

Теперь, подготовившись, начнем с двух измерений.

Двухмерная диаграмма рассеяния

Диаграмма рассеяния — весьма простой и распространенный график. Из 6 параметров, price и curb-weight используются ниже как Y и X соответственно.

В plotly процесс немного отличен от аналогичного в Matplotlib. Мы должны создать layout и figure, передав их в функцию offline.plot, после чего результат будет сохранён в HTML файл в текущей рабочей директории. Вот скриншот того, что получится. В конце статьи будет ссылка на GitHub репозиторий с готовыми интерактивными HTML-графиками.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Диаграмма рассеяния в 3D

Мы можем добавить третий параметр horsepower (количество лошадиных сил) на ось Z. Plotly предоставляет функцию Scatter3D для построения интерактивных трёхмерных графиков.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Вместо того чтобы вставлять код сюда каждый раз, я добавлял его в репозиторий.

(Удобнее всего смотреть релевантный код в соседней вкладке параллельно со чтением — прим. перев.)

Добавление четвёртого измерения

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

Здесь, наряду с тремя предыдущими характеристиками, мы будем использовать пробег в городских условиях — city-mpg как четвертое измерение, за которое будет отвечать параметр markercolor функции Scatter3D. Более светлый оттенок маркера будет означать меньший пробег.

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

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Добавление пятого измерения

Размер маркера можно использовать для визуализации 5-го измерения. Мы используем характеристику engine-size (размер двигателя) для параметра markersize функции Scatter3D.

Наблюдения: размер двигателя связан с некоторыми из предыдущих параметров. Чем выше цена, тем больше двигатель. Ра́вно как и: ниже пробег — больше двигатель.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Добавление шестого измерения

Форма маркера отлично подходит для визуализации категорий. Plotly даёт на выбор 10 различных фигур для 3D графика (звёздочка, круг, квадрат и т.д.). Таким образом, в качестве формы можно показать до 10 различных значений.

У нас есть характеристика num-of-doors, которая содержит целые числа — количество дверей (2 или 4). Преобразуем эти значения в фигуры: квадрат для 4 дверей, круг для 2 дверей. Используется параметр markersymbol функции Scatter3D.

Наблюдения: такое чувство, что у всех самых дешёвых машин по 4 двери (круги). Продолжая изучать график, можно будет сделать больше предположений и выводов.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

6D график с формой маркера в качестве шестого измерения (количество дверей)

Можем ли мы добавить больше измерений?

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

Исходный код

Код на Python и интерактивные графики для всех фигур доступны на GitHub здесь.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

В продолжении темы о графиках функций в Excel расскажу о построении трехмерных графиков.

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

Построим график функции, называемый гиперболический параболоид, в Excel.

Уравнение гиперболического параболоида (общий вид):

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

где x, y, z — переменные; a, b — константы.

Рассмотрим конкретный случай:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Как и для построения графика функции на плоскости нам потребуется таблица, на основании которой график и будет построен.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

по горизонтали — значения х, по вертикали — значения у.

Значения z вычисляются по формуле (см. выше). Запишем формулу для вычисления z, где x=10, y = 10, a=2, b=3.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Используя маркер автозаполнения, копируем формулу для всех значений x и y.

Получим таблицу, в которой каждой паре (x, y) соответствует координата z.

Выделяем диапазон ячеек со значениями z, выбираем ВСТАВКА — ДРУГИЕ ДИАГРАММЫ — ПОВЕРХНОСТЬ

Источник

3D моделирование в Python

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Допустим, вам потребовалось на языке программирования python, построить трёхмерную модель некоторого объекта, затем визуализировать его, или подготовить файл для печати на 3D принтере. Существует несколько библиотек, помогающих в решении этих задач. Поговорим о том, как строить трёхмерные модели из точек, граней и примитивов в python. Как выполнять элементарные приемы 3D моделирования: перемещение, поворот, объединение, вычитание и другие.

Примеры кода можно найти в репозитории на GitHub.

Docker для исполнения примеров Pymesh:

sudo sh get-docker.sh

Компилятор g++ для PyTorch3d:

sudo apt install g++

Клонирование репозитория и установка библиотек:

git clone https://github.com/format37/python3d.git

pip install «git+https://github.com/facebookresearch/pytorch3d.git»

sudo apt-get install openscad

Numpy-stl: Обзор библиотеки

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикИзображение из Википедии

Если вы не знакомы с Jupyter notebook

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикВершины пирамиды

Несмотря на то, что пока описаны только вершины, уже можно взглянуть как будет выглядеть модель, если соединить их треугольниками:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикИзоповерхность пирамиды

Выглядит так, будто грани уже существуют. Но пока у нас есть только вершины. Чтобы сформировать stl файл, опишем грани, что можно сделать вручную, или предоставить эту работу функции spatial.ConvexHull из библиотеки scipy

В результате, массив faces содержит описание граней:

Например, последняя грань содержит числа 3, 1, 0. Значит грань собрана из точек 0-го, 1-го и 3-го элементов массива vertices:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикПринцип описания граней через позиции вершин

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикГрани пирамиды

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

Для просмотра stl файлов разработано довольно много программ. Одна из них называется Blender, доступна для скачивания и не требует оплаты за использование

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: numpy_stl_example_02.stl

Метод spatial.ConvexHull предназначен для вычисления выпуклой оболочки и хорошо справляется с пирамидой и кубом. Но в объектах, имеющих впадины, часть точек будет потеряна и при сборке stl произойдет ошибка из-за несоответствия количества граней количеству точек.

Это хорошо видно на примере в двух измерениях: numpy_stl_example_03.ipynb

В hull.simplices содержится описание граней:

Отобразим вершины и грани на графике:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикЦентральные точки не связаны с гранями

Для таких случаев придется найти альтернативу ConvexHull, или описать грани вручную:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикДобавлено две грани: одна для нижней точки, одна для верхней

Numpy-stl: Построение фрактала

Пришло время построить фрактал. В numpy-stl нет функции булева вычитания. Для построения фрактала Menger Sponge пойдем от обратного. В нашем распоряжении два метода:

Построение элементарного mesh куба. Назовем его voxel.

Объединение нескольких voxel в единый mesh.

Построим фрактал из кубиков, как из конструктора.

Описание логики построения фрактала

Найдем сторону вокселя на глубинах 1 и 2. Упростим задачу, свернув фрактал с 3-х до 1-мерного случая:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Если фрактал второго уровня, длина стороны куба составит 1/(3**2) или 1/9. Составим набор кубов так, чтобы своим расположением они заполнили исходный куб. Получится воксельный куб. Вычислим области отверстий. Исключим воксели, которые входят в области отверстий. В завершение, объединим оставшиеся воксели в один объект и сохраним.

Numpy-stl: Рендеринг изображения

Для рендеринга, в функцию вывода plot_mesh, будем передавать mesh, загруженный из stl файла.

PyMesh: Обзор библиотеки

К сожалению, библиотека PyMesh не установилась у меня ни через менеджер пакетов PIP (несмотря на упоминание этого способа в документации), ни через Anaconda. Есть два способа установки.

Следуя инструкции, собрать из исходников.

Используя Docker контейнер. Выберем этот вариант, как более интересный. Запуск контейнера будет инициирован с параметрами. При помощи параметров запуска смонтируем в контейнер папку скриптов. Передадим необходимые параметры в скрипт. После завершения работы скрипта, контейнер будет удален. Если Docker вы уже установили следуя инструкции в начале статьи, более ничего устанавливать не нужно.

Если Docker вам не подходит, скомпилируйте PyMesh, следуя инструкции в документации. Такой вариант тоже будет работать.

Начнем с простого куба. В папке pymesh_examples находится скрипт pymesh_example_01.py. В дальнейшем, контейнер будет брать файлы именно из этой папки.

Из корня проекта запустим контейнер:

Что тут происходит?

Запускается контейнер pymesh. При первом запуске будет загружен образ, это займёт некоторое время.

Папка pymesh_examples монтируется в контейнер

В контейнере запускается python скрипт /pymesh_examples/pymesh_example_01.py

Импортируется библиотека pymesh

функция generate_box_mesh генерирует куб на основании двух противоположных вершин в точках [0,0,0] и [1,1,1]

функция save_mesh сохраняет объект в stl файл.

После исполнения, в папке pymesh_examples появляется файл pymesh_example_01.stl

Квадратное отверстие сделаем при помощи булева вычитания. Строим параллелепипед и вычитаем его из основного куба.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: pymesh_example_02.stl

Здесь boolean применяется не только для вычитания. Всего доступно 4 операции:

Difference: AB (два последних примера)

Symmetric difference: A XOR B (изображение не представлено)

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикИллюстрация применения операции boolean на сфере и кубе

Чтобы лучше понять как перемещать и вращать объект, бывает удобно временно заменить операцию Difference на Union.

Сделаем второе отверстие, переместим и повернем его.

В этом скрипте добавлены функции перемещения и поворота. При перемещении создается новый mesh объект на основании измененных вершин и граней исходного объекта. Для поворота, сначала при помощи класса Quaternion, описывается поворот, а затем, аналогично случаю с перемещением, используется создание нового, повернутого объекта, на основании вершин и граней исходного объекта, а также описания поворота.

О кватернионах есть довольно подробная статья:

В результате исполнения скрипта, получается куб с двумя пересекающимися отверстиями:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: pymesh_example_03.stl

Перечисленных инструментов достаточно для построения фрактала.

PyMesh: Построение фрактала

В этом скрипте добавлен входящий параметр для передачи глубины вычисления фрактала. Для каждой глубины создается параллелепипед, который затем дважды копируется, поворачивается и смещается. Получается всего 3 параллелепипеда, которые вычитаются из основного куба. По одному на каждую грань. Операция повторяется x и y раз, чтобы заполнить все строки и колонки грани. Проверка на вычитание из пустого пространства не выполняется.

На этот раз при запуске необходимо явно указать глубину фрактала:

Исполняться он будет 5-15 минут. После исполнения, в папке pymesh_examples появляется stl файл:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: pymesh_example_04_3.stl Если запросить фрактал 4-го уровня

Построение займет около 4-х часов, а размер файла составит 73 мб:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: pymesh_example_04_4.stl

PyMesh: Рендеринг изображения

Mesh мы уже поворачивали, на этот раз повернём камеру.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикОдин из кадров анимации Показать анимацию

PyTorch3d: Обзор библиотеки

В примере ниже, сразу на устройстве описываем вершины, копируем их с устройства на хост. На основании вершин вычисляем грани. Сохраняем объект. Файл в формате obj можно импортировать в blender:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: pytorch3d_example_01.obj

Обратите внимание на команду verts.cpu().numpy()

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

PyTorch3d: Построение фрактала

Использование GPU даёт некоторый прирост производительности.

В этом скрипте объявляем вершины минимального для указанной глубины вокселя. По знакомому из прошлого примера алгоритму вычисляем координаты отверстий в двух измерениях. Заполняем первичный куб вокселями, которые не попадают в пределы отверстий.

Cкорость расчета увеличилась на порядок, что позволило примерно за 5 часов построить фрактал 5 уровня:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender Menger Sponge 5 lvl

Размер stl файла составил 1.9 ГБ. При построении фрактала 5-го уровня, программа останавливалась из-за переполнения памяти видеокарты. Пришлось сборку объекта выполнять пакетами. Создавалось по 10 слоев “двумерных” фракталов, затем они присоединялись к основному объекту, до тех пор, пока не построился полный фрактал.

PyTorch3d: Рендеринг изображения

Помимо plotly визуализаций, pytorch3d отдельно выделяет рендеринг и подход нему тут довольно основательный, с текстурами и шейдерами.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

SolidPython: Обзор библиотеки

SolidPython Самая богатая методами моделирования библиотека, среди перечисленных. 3D сцена описывается на python, в формате, очень похожем на openscad, генерируется openscad код, который пишется в scad файл и далее его можно редактировать в openscad или сразу сохранить в stl.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Openscad: solidpython_example_01.scad

solidpython удобно отлаживать. С одной стороны экрана открыт scad файл, с другой jupyter notebook. При исполнении scad_render_to_file картинка в openscad автоматически обновляется.

Если нужен stl, openscad умеет рендерить файлы этого формата через команды консоли. Пример вызова из jupyter notebook:

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Blender: solidpython_example_01.stl

Общий принцип такой: Любая функция возвращает объект. Если над объектом необходимо произвести некоторое действие, объект (или список объектов) передается в круглых скобках после вызова соответствующей функции.

Тут разрешение регулируется параметром slices.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный графикСнимок экрана. Openscad: solidpython_example_02.scad

SolidPython: Построение фрактала

SolidPython: Рендеринг изображения

Сформируем серию изображений последней сцены, поворачивая камеру в каждом изображении.

Как рисовать трехмерный график. Смотреть фото Как рисовать трехмерный график. Смотреть картинку Как рисовать трехмерный график. Картинка про Как рисовать трехмерный график. Фото Как рисовать трехмерный график

Кроме того, solidpython предлагает формирование анимации средствами openscad. В документации об этом есть небольшой раздел с примером.

Напоследок рассмотрим код, использованный для построения сцены из заголовка статьи.

Сравнение библиотек

Сравнение производительности не совсем объективно, так как имеются значительные различия в алгоритмах. В Pymesh и SolidPython применялось вычитание, тогда как в Numpy-stl и Pytorch3d объединение mesh.

(Время вычисления фрактала 3-го уровня, в секунду)

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *