Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Технология вокселей в библиотеке matplotlib
В прошлой статье мы уже столкнулись с технологией вокселей. Продолжим эту интересную темы. Воксель это аналог пикселей, но только в пространстве.
Представим себе, что пространство представляет собой некоторый куб. Он может быть сплошным, как это было в предыдущей статье. Но его можно делить на прямоугольные части: разных размеров, разных цветов или вообще без цвета или точнее, эта часть может быть пустым местом. В результате у нас появляется очень мощный инструмент объёмных изображений.
Воксельная структура определяется трёхмерным массивом (списком). Если кратко, то двумерные массивы определяют деление куба на части, путём разрезания перпендикулярно оси X, а одномерные массивы внутри двумерных деление путём разрезания перпендикулярно оси Y, наконец элементы одномерного массива определяют разрезание куба перпендикулярно оси Z.
Первый пример. Делим куб перпендикулярно оси X.
#!/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]],[[1]]])
a1 = np.array([[['blue']],[['red']]])
ax.voxels(a, facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")
Массив a определяет деление куба, список a1 определяет цвета полученных частей. Полученный куб представлен на рисунке 1.
Второй пример. Делим куб перпендикулярно оси Y.
#!/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],[1]]])
a1 = np.array([[['blue'],['red']]])
ax.voxels(a, facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")
Результат выполнения представлен на рисунке 2.
Пример 3. Делим куб перпендикулярно оси z
#!/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,1]]])
a1 = np.array([[['blue','red']]])
ax.voxels(a, facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")
Результат выполнения программы см. на рисунке 3.
Попробуем теперь разделить куб 8 одинаковых разноцветных кубиков
#!/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,1], [1, 1]],[[1,1], [1, 1]]])
a1 = np.array([[['blue','red'],['pink','green']],[['olive','cyan'],['violet','indigo']]])
ax.voxels(a, facecolors=a1, edgecolor='black', shade=False, alpha=0.5)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")
plt.show()
Результат выполнения на рисунке 4. Мы добавили элемент прозрачности, чтобы были видны цвета задних кубиков.
Ну а теперь уберём одну колонку кубиков. Для для этого нужно просто взять следующий массив
a = np.array([[[1,1], [1, 1]],[[0,0], [1, 1]]])
и получим куб, представленный на рисунке 5
Основные идея я изложил, теперь те, кому интересно, могут поиграть с технологией. Но я всё же вернусь к ней в следующей статье, уж очень она интересная.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.