You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Widget Interact绘图,按钮控制plt.plot出现y未定义错误

解决ipywidgets按钮控制绘图时的参数未定义问题

错误原因

你遇到的y未定义错误有两个核心原因:

  1. 按钮的on_click回调函数默认只会接收按钮实例作为唯一参数,但你定义的plot_point要求传入x和y,参数不匹配导致报错。
  2. 你没有保存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:57:24