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

如何在PySimpleGUI的Canvas中创建用户输入更新Matplotlib图表Y轴

实现思路与示例代码

核心逻辑

将Matplotlib图表嵌入PySimpleGUI窗口,监听输入控件的变化事件,触发图表数据更新并重新渲染,实现实时刷新效果。

具体步骤

  • 1. 整合PySimpleGUI与Matplotlib
    用PySimpleGUI的Canvas元素承载Matplotlib画布,先初始化Matplotlib的Figure和Axes对象,再将画布绑定到GUI元素上。
  • 2. 设计输入控件
    若为预设Y轴数值,用sg.DropDown更便捷;若需自定义数值,用sg.Input配合格式验证。以下拉框为例,预设多组Y轴数据选项。
  • 3. 事件循环处理更新
    在窗口事件循环中监听输入控件的触发事件,用户选择/输入新数值后,更新Axes的数据,调用画布重绘方法完成实时更新。

示例代码

import PySimpleGUI as sg
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# 预设多组Y轴数据集选项
y_data_options = {
    "数据集1": [1, 3, 2, 5, 4],
    "数据集2": [2, 4, 6, 8, 10],
    "数据集3": [5, 3, 1, 3, 5]
}
x_data = [1, 2, 3, 4, 5]

# 初始化Matplotlib基础图表
fig, ax = plt.subplots(figsize=(6, 4))
line, = ax.plot(x_data, y_data_options["数据集1"])
ax.set_xlabel("X轴")
ax.set_ylabel("Y轴")
ax.set_title("实时更新图表")

# PySimpleGUI窗口布局
layout = [
    [sg.Text("选择Y轴数据集:"), sg.DropDown(list(y_data_options.keys()), default_value="数据集1", key="-Y-DATA-", enable_events=True)],
    [sg.Canvas(key="-CANVAS-")]
]

window = sg.Window("Matplotlib实时更新", layout, finalize=True)

# 将Matplotlib画布绑定到GUI的Canvas元素
canvas = FigureCanvasTkAgg(fig, window["-CANVAS-"].TKCanvas)
canvas.draw()
canvas.get_tk_widget().pack(side="top", fill="both", expand=1)

# 事件循环处理
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    # 监听Y轴数据集选择事件
    if event == "-Y-DATA-":
        selected_y = y_data_options[values["-Y-DATA-"]]
        line.set_ydata(selected_y)
        # 自动调整Y轴范围适配新数据
        ax.relim()
        ax.autoscale_view()
        canvas.draw()

window.close()
plt.close(fig)

关键细节说明

  • enable_events=True:必须给输入控件添加该参数,才能在用户操作时触发事件。
  • set_ydata:直接修改已有线条的Y轴数据,比重新绘制整张图表更高效。
  • relim()和autoscale_view():自动调整坐标轴范围,避免新数据超出原有显示区域。
  • finalize=True:窗口初始化时添加该参数,才能在窗口创建后操作TKinter底层元素(如绑定画布)。

若需支持自定义数值输入,可将下拉框替换为输入框,事件处理逻辑如下:

# 替换布局中的下拉框为输入框
[sg.Text("输入Y轴数值(逗号分隔):"), sg.Input("1,3,2,5,4", key="-Y-INPUT-", enable_events=True)]

# 对应事件处理部分
if event == "-Y-INPUT-":
    try:
        # 将输入字符串转换为数值列表
        selected_y = list(map(float, values["-Y-INPUT-"].split(",")))
        # 确保X、Y数据长度一致
        if len(selected_y) == len(x_data):
            line.set_ydata(selected_y)
            ax.relim()
            ax.autoscale_view()
            canvas.draw()
    except ValueError:
        sg.popup("请输入正确格式的数值,用逗号分隔")

内容的提问来源于stack exchange,提问作者greenkarhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:40:23