首页 > 解决方案 > matplotlib 3d --- 颤动更新

问题描述

我正在使用 matplotlib 的 quivers 在 3d 轴上绘制一些向量。问题是当我想添加一个滑块小部件并根据滑块更新矢量的大小时,一旦我改变了位置,一切都按我的预期工作,但我失去了箭袋的箭头。

这是示例代码:

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

fig = plt.figure(figsize=(10,6))
ax = fig.gca(projection='3d')
plt.subplots_adjust(bottom=0.15)

ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(-1, 1)

pos = [0.0, 0.0, 0.0]
V_ini = [0.5, 0.0, 0.0]

V = ax.quiver(*pos, *V_ini, length=1, normalize=False, color='green')

# SLIDER POSITIONS ON FIGURE
axcolor = 'lightgoldenrodyellow'
axVx = plt.axes([0.1, 0.11, 0.15, 0.02], facecolor=axcolor)
axVy = plt.axes([0.1, 0.08, 0.15, 0.02], facecolor=axcolor)
axVz = plt.axes([0.1, 0.05, 0.15, 0.02], facecolor=axcolor)

# SLIDER PROPERTIES
sliderVx = Slider(axVx, 'Vx', -1, 1, valinit=V_ini[0], valstep=0.01)
sliderVy = Slider(axVy, 'Vy', -1, 1, valinit=V_ini[1], valstep=0.01)
sliderVz = Slider(axVz, 'Vz', -1, 1, valinit=V_ini[2], valstep=0.01)

# QUIVER TO SEGMENT CONVERTER
def q2s(X, Y, Z, u, v, w, length=1):
    segments = (X, Y, Z, X+u*length, Y+v*length, Z+w*length)
    segments = np.array(segments).reshape(6,-1)
    return [[[x, y, z], [u, v, w]] for x, y, z, u, v, w in zip(*list(segments))]

def update(val):
    V_ = (sliderVx.val, sliderVy.val, sliderVz.val)
    V.set_segments(q2s(*pos, *V_))


sliderVx.on_changed(update)
sliderVy.on_changed(update)
sliderVz.on_changed(update)

plt.show()

这是以前的样子:

前

在我更新之后:

后

我知道将箭袋转换为线段会导致问题,但我不知道任何其他更新箭袋的方法。任何帮助将不胜感激。

标签: pythonmatplotlib

解决方案


推荐阅读