使用Widget Interact绘图,按钮控制plt.plot出现y未定义错误
解决ipywidgets按钮控制绘图时的参数未定义问题
错误原因
你遇到的y未定义错误有两个核心原因:
- 按钮的
on_click回调函数默认只会接收按钮实例作为唯一参数,但你定义的plot_point要求传入x和y,参数不匹配导致报错。 - 你没有保存interact控件选中的x、y值,这些值并非全局变量,回调函数无法直接读取。
解决方案一:通过interact返回的控件读取选中值
这种方式无需全局变量,直接获取interact生成的控件对象,读取其value属性来获取当前选中的x、y值,是更规范的实现方式:
import ipywidgets as widgets import matplotlib.pyplot as plt def f(x,y): display(x,y) return (x,y) # 保存interact返回的交互对象,里面包含生成的x、y控件 interactive_obj = widgets.interact(f, x=[('1',10),('2',20),('3',30),('4',40)], y=[('1',1),('2',2),('3',3),('4',4)]) # 从交互对象中提取x和y控件 x_widget, y_widget = interactive_obj.children # 按钮回调函数,用下划线占位接收按钮实例,读取控件当前值绘图 def plot_point(_): x_val = x_widget.value y_val = y_widget.value plt.plot(x_val, y_val, 'bo') plt.show() # 强制刷新显示图表 btn = widgets.Button(description='Enter') display(btn) btn.on_click(plot_point)
解决方案二:用全局变量保存选中值
如果是简单脚本场景,可以用全局变量存储每次选中的x、y值,回调函数直接读取全局变量:
import ipywidgets as widgets import matplotlib.pyplot as plt # 定义全局变量存储选中的x、y selected_x = None selected_y = None def f(x,y): global selected_x, selected_y selected_x = x selected_y = y display(x,y) return (x,y) widgets.interact(f, x=[('1',10),('2',20),('3',30),('4',40)], y=[('1',1),('2',2),('3',3),('4',4)]) def plot_point(_): # 确保x、y已被选中后再绘图 if selected_x is not None and selected_y is not None: plt.plot(selected_x, selected_y, 'bo') plt.show() btn = widgets.Button(description='Enter') display(btn) btn.on_click(plot_point)
内容的提问来源于stack exchange,提问作者LittleBit
相关产品推荐
相关产品推荐

