ax.quiver: мне не хватает векторного поля в 3D, как мне получить красивые линии тока

У меня проблема, когда я хочу показать линии тока в 3D. Функция streamplot делает это хорошо в 2D, но не существует в 3D. Я не хочу иметь двухмерный стримплот на трехмерной фигуре, но 3D-стримплот на трехмерной фигуре. Единственное, что я нашел, это построение векторного поля с помощью ax.quiver. К сожалению, быстро становится трудно что-то увидеть:

Что я имею

Мой код:

width   = 8.27
fac     = 1.75
display = 1                   # display: set to 1 to see show to figure
sve_pdf = 0                   # sve_pdf: set to 1 to save as pdf
sve_png = 0                   # sve_png: set to 1 to save as png
mu      = 1

# importing
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as pyplot
import numpy as np

# plotting
fig = pyplot.figure(figsize=(width,width/fac))
ax = fig.gca(projection='3d')

x, y, z = np.meshgrid(np.linspace(-1., 1., 10),
                      np.linspace(-1., 1., 10),
                      np.linspace(-1., 1., 10))

u = (3./4.) * (mu / np.pi) * (x*z) / ((x**2+y**2+z**2)**5/2)
v = (3./4.) * (mu / np.pi) * (y*z) / ((x**2+y**2+z**2)**5/2)
w = - (mu / 4. * np.pi) * (1.-1.5*(z**2)*((x**2+y**2+z**2)**-2)) / ((x**2+y**2+z**2)**3/2)

u_plot = np.maximum(np.minimum(u,0.5),-0.5)
v_plot = np.maximum(np.minimum(v,0.5),-0.5)
w_plot = np.maximum(np.minimum(w,0.5),-0.5)

ax.quiver(x, y, z, u_plot, v_plot, w_plot, length = 0.5, linewidths = 0.5)

if display:
    pyplot.show()

# saving
base = 'Doublet3D'
if sve_png == 1:
    filename = base + '.png'
    pyplot.savefig(filename, format='png', bbox_inches = 'tight', pad_inches = 0.05, dpi=600)
if sve_pdf == 1:
    filename = base + '.pdf'
    pyplot.savefig(filename, format='pdf', bbox_inches = 'tight', pad_inches = 0.05, dpi=600)

Есть ли способ получить обтекаемые линии в 3D? Если нет, что бы вы предложили, чтобы мы могли видеть, что происходит?

0 ответов

Другие вопросы по тегам