通过 3D matplotlib 中的函数更新线对象

问题描述 投票:0回答:1

我想使用一个小部件来绘制 3d 函数的 y 轨迹。 我 2D 一切顺利,更新函数更新 2D 线对象的 y 值。

但是在 3D 中,注意到了,我设置了 y 值并使用滑块更改它们,但线没有移动。我很困惑。

这是两个版本的代码 二维

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider
fig=plt.figure()

ax1=fig.add_axes([0,0,1,0.8])
x=np.linspace(-2*np.pi,2*np.pi,300)
y=np.sin(x)
drawing,=plt.plot(x,y)


def update(val):
    freq=s_x.val
    y=np.sin(freq*x)
    drawing.set_ydata(y)
    plt.draw()


slider_position=plt.axes([0.25,0.03,0.4,0.04])

s_x=Slider(slider_position, 'fréquence',1,6,valinit=2)
s_x.on_changed(update)
update(1)

plt.show()

3D

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider


fig_1=plt.figure(figsize=[7,4])
ax1=fig_1.add_subplot(projection='3d') 




slider_position=plt.axes([0.25,0.03,0.4,0.04])

s_y=Slider(slider_position,'trace of y',-5,5,valinit=0)

x_point=np.linspace(-5,5,25)
y_point=np.full(25,2)
z_trace_y=x_point**2+y_point
trace_y,=ax1.plot(x_point,y_point,z_trace_y,'r')


def update(val):
    
    test=s_y.val
    
    y_point=np.full(25,test)
    trace_y.set_ydata(y_point)
    plt.draw()
    
      

s_y.on_changed(update)  


plt.show()
widget interactive matplotlib-3d
1个回答
0
投票

如果您使用

projection='3d'
创建子图,您的更新函数必须为所有 3 个维度重新分配值。如果没有这个,这条线就不会移动,甚至可能完全消失!

解决方案

使用

trace_y.set_data(...)
更改
x
y
数据点。然后使用
trace_y.set_3d_properties(...)
更新
z-axis
上的数据点。在您的更新功能中完成所有这些操作。

代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider

fig_1=plt.figure(figsize=[7,4])
ax1=fig_1.add_subplot(projection='3d') 

ax1.set_ylim(-6,6) # THIS HELPS KEEP YOUR LINE WITHIN VIEW

slider_position=plt.axes([0.25,0.03,0.4,0.04])

s_y=Slider(slider_position,'trace of y',-5,5,valinit=0)

x_point=np.linspace(-5,5,25)
y_point=np.full(25,2)
z_trace_y=x_point**2+y_point
trace_y,=ax1.plot(x_point,y_point,z_trace_y,'r')

def update(val):
    test=s_y.val
    
    y_point=np.full(25,test)
    z_trace_y=x_point**2+y_point # RE-CALCULATE Z
    trace_y.set_data(x_point,y_point) # SET VALUES FOR X/Y
    trace_y.set_3d_properties(z_trace_y) # SET Z-VALUES
    plt.draw()

s_y.on_changed(update)  

plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.