我想使用一个小部件来绘制 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()
如果您使用
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()