Вопрос

Я пытаюсь сделать 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top