Как построить 3D -патч -коллекцию в Matplotlib?
-
25-10-2019 - |
Вопрос
Я пытаюсь сделать 3D -график в Matplotlib с тремя кругами на нем, каждый из которых был центрирован на начале координат и с радиусом 1, указывая в разных направлениях - например, иллюстрировать сферу радиуса 1.
В 2D я бы сделал коллекцию круговых патч и добавил ее к осям. В 3D у меня возникли проблемы с тем, чтобы привлечь патчи вообще появляются, не говоря уже о том, чтобы ориентироваться на них в разных направлениях.
import matplotlib
import matplotlib.pyplot as P
import mpl_toolkits.mplot3d as M3
fig = P.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
circles = matplotlib.collections.PatchCollection(
[matplotlib.patches.Circle((0, 0), 1) for count in range(3)],
offsets=(0, 0))
M3.art3d.patch_collection_2d_to_3d(circles, zs=[0], zdir='z')
ax.add_collection(circles)
P.show()
Запуск этой программы заполняет все окно сюжета синим, то есть цвет лица пятен, независимо от того, как я вращаю сюжет. Если я настрою facecolor='none'
в PatchCollection()
позвонить, затем пустой Axes3D
появляется.
Вещи, которые я пробовал:
- Если я использую
CircleCollection
вместоPatchCollection
, никакие патчи вообще не появляются. А
zs
параметр вpatch_collection_2d_to_3d()
звонок нечетный; Я ожидаю, чтобы поставить тожеzs=0
(один Z-координат для всех трех пятен) илиzs=[0,0,0]
(Отдельный Z-координат для каждого патча), но оба из них бросают ошибку:ValueError: настройка элемента массива с последовательности.
Чтобы по -разному ориентироваться
zdir=['x', 'y', 'z']
Но результаты ничем не отличаются, не прохожу я или'z'
или же['z']
.- Я также ожидал, что сможет сделать
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])
Вместо преобразования коллекции патчей с 2D в 3D, но это также бросает ошибку:ATTRIBUTERROR: 'Patch3dCollection' объект не имеет атрибута 'set_sort_zpos'
Решение
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, PathPatch
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d.art3d as art3d
fig = plt.figure()
ax=fig.gca(projection='3d')
for i in ["x","y","z"]:
circle = Circle((0, 0), 1)
ax.add_patch(circle)
art3d.pathpatch_2d_to_3d(circle, z=0, zdir=i)
ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
plt.show()