Найти в Дзене
programmer's notes (python and more)

Программирование на языке python. Библиотека matplotlib. Построение некоторых объёмных фигур

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Библиотека matplotlib и объёмные фигуры

Интересная область работы с библиотекой matplotlib это объёмные фигуры. Да, это в сущности поверхности, но образующие замкнутое пространство. Иногда удобно использовать угловые координаты. Есть и специальные средства, о которых мы поговорим.

matplotlib. Построение сферы

В начале поcтроим сферу (см. программу ниже).

#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
a1, b1 = np.linspace(0, 2 * np.pi, 30), np.linspace(0, np.pi, 30)
A1, B1 = np.meshgrid(a1, b1)
R = np.cos(B1)
X = R * np.sin(B1) * np.cos(A1)
Y = R * np.sin(B1) * np.sin(A1)
Z = R * np.cos(B1)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
plot = ax.plot_surface(X, Y, Z, rcount=30, ccount=30, cmap='twilight',\
edgecolors='#ff0000', linewidth=0.3, alpha=0.5)
plt.savefig("my_diag.png")

Ниже на рисунке 1 представлена построенная сфера.

Для построения сферы нужно построить набор углов: угла к оси z, от 0 до пи (b1), и угла в плоскости xy от 0 до двух пи (a1). Стандартным образом получаем сетку значений с помощью meshgrid(). На основе этих углов можно легко получить наборы координат X, Y, Z. Радиус условно считаем длиной 1 (R).

Рисунок 1. Построениесферы
Рисунок 1. Построениесферы

matplotlib. Построение цилиндра

Цилиндр можно также строить по угловым координатам. А можно на основе простых алгебраических формул. В этом случае цилиндр составляется из двух его половинок (см. программу ниже).

#!/usr/bin/python3
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x=np.linspace(-1, 1, 100)
z=np.linspace(0, 1, 100)
Xc, Zc=np.meshgrid(x, z)
Yc = np.sqrt(1-Xc**2)
ax.plot_surface(Xc, Yc, Zc, alpha=0.6, rcount=10, ccount=10,
color='#00dddd', edgecolors='#995555', linewidth=0.3)
ax.plot_surface(Xc, -Yc, Zc, alpha=0.6, rcount=10, ccount=10,
color='#00dddd', edgecolors='#995555', linewidth=0.3)
plt.savefig("my_diag.png")

Результат выполнения программы см. ниже на рисунке 2.

Рисунок 2. Построение цилиндра
Рисунок 2. Построение цилиндра

К точно такому же результату можно прийти исходя чисто из углового подхода.

#!/usr/bin/python3
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
al = np.linspace(0, 2 * np.pi, 100)
z = np.linspace(0, 1, 100)
AL, Z = np.meshgrid(al, z)
X, Y = np.cos(AL), np.sin(AL)
ax.plot_surface(X, Y, Z, alpha=0.6, rcount=10, ccount=10,
color='#00dddd', edgecolors='#995555', linewidth=0.3)
plt.savefig("my_diag.png")

Мы просто определяем множество углов в плоскости XY и вычисляем множество значений координат x и y для каждого значения z. Угловой подход хорош тем, что мы строим сплошную фигуру (цилиндр), а не создаём её из двух полуцилиндров.

matplotlib. Построение куба

Для построения куба удобнее всего использовать технику вокселей (voxels).

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection = '3d')
a = np.array([[[1]]])
a1 = np.array([[['blue']]]) # массив цветов
# строим куб
# edgecolor - цвет рёбер
ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False)
plt.savefig("my_diag.png")

Данный пример (рисунок 3) представляет собой простей вариант использования техники вокселей. Кстати, чтобы были видны задние грани, используйте параметр alpha (прозрачность), например, присвойте ему значение 0.5:

ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False, alpha=0.5)

Рисунок 3. Построения куба с помощью метода voxels()
Рисунок 3. Построения куба с помощью метода voxels()

В следующей статье мы продолжим работать с вокселями.

Следующая статья по теме

Ну, пока всё!

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

Приближается год Питона
Приближается год Питона