python - 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()
这是以前的样子:
在我更新之后:
我知道将箭袋转换为线段会导致问题,但我不知道任何其他更新箭袋的方法。任何帮助将不胜感激。
解决方案
推荐阅读
- excel - ADODB Recordset:关闭对象时不允许操作
- sonarqube - 我如何知道哪条规则对 sonarqube web api 有效或无效?
- reactjs - material-ui createMuiTheme 调色板类型深色不会将文本颜色更改为浅色
- python - 根据正在运行的测试用例切换装饰器的顺序?
- javascript - Typescript - 将 ngModel 绑定到对象的属性
- java - 尝试创建一系列对话,其中每个对话都有前一个和下一个
- excel - Excel - 创建具有多个条件的唯一值列表
- ffmpeg - 检测视频帧偏移以智能方式同步视频
- angular - Angular 服务类单元测试失败,无法解析所有参数
- svn - svn - 使本地分支与远程分支相同