Порядок объекта в 3d сюжете - спираль - PullRequest
1 голос
/ 16 февраля 2020

Я нарисовал спираль и линию, которая должна go пройти по спирали. Я не могу установить, что линия находится за передней частью спирали и перед задней частью спирали. Я пытался использовать zorder, но линия либо целая перед спиралью, либо целая за спиралью. Спасибо

Код:

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

mpl.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve')

ax.plot([-1,-1], # x
        [2,2], # y
        [-2, 2], c='red')

plt.show()

enter image description here

Например, здесь. Красная линия перед спиралью. Если я установлю Зордер, это может быть за спиралью. Как правильно установить линию, проходящую по спирали?

1 Ответ

1 голос
/ 18 февраля 2020

Обратите внимание, что matplotlib не полностью 3D. Чтобы получить достаточную скорость для сложных сюжетов, 3D моделирует рисование всего на заднем плане, причем каждый элемент рисуется целиком на определенной глубине c. Если вам нужно полное 3D, стоит изучить такие пакеты, как mayavi .

Чтобы получить красную линию внутри спирали, используя matplotlib, можно использовать следующий подход:

  1. нарисуйте спираль
  2. нарисуйте красную линию
  3. снова нарисуйте спираль, но только ту часть, которая будет перед линией

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

Теперь, чтобы нарисовать только часть кривой, стандартный способ использует numpy массивы в маске . Но они, кажется, не соблюдаются 3D-сюжетом. Альтернативой является установка нежелательных точек на NaN.

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

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='parametric curve') # the full spiral

ax.plot([-1,-1], # x
        [2,2], # y
        [-2, 2], c='red', lw=10)

ym = np.copy(y)
ym[y > 0] = np.NaN
ax.plot(x, ym, z, color='lime') # partial spiral

plt.show()

resulting plots

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...