Доброго времени суток, читатели, зрители моего канала 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).
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.
К точно такому же результату можно прийти исходя чисто из углового подхода.
#!/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)
В следующей статье мы продолжим работать с вокселями.
Следующая статья по теме
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.