首页 > 编程问答 >matplotlib 使用滑块时出现的问题

matplotlib 使用滑块时出现的问题

时间:2024-07-23 10:51:48浏览次数:7  
标签:python python-3.x slider matplotlib-widget

我使用数据集,训练了一个模型并想要获取更多数据,因此我在未标记的数据上使用我的模型,然后使用模型制作的标签绘制数据,看看它是否是一个好的标签。我想实现一个滑块来选择标签的不透明度,看看它是否是相关标签。 问题是滑块确实显示,但我无法与其交互。

这是我的代码,我有最新版本的 matplotlib,

def mise_a_jour_graphique(val):
    global fig
    alpha = slider_alpha.val
    a_dessiner(alpha)
    fig.canvas.draw_idle()

def a_dessiner(alpha):
    global nb_label
    global coor
    global image_rgb
    global ax
    global fig
    annotations = []

    ax.clear()
    ax.imshow(image_rgb)  # Afficher l'image de fond

    for i, el in coor:
        annotation = dessin(i, el, image_rgb, alpha)
        fig.canvas.draw_idle()
        annotations.append(annotation)

    nb_label = len(annotations)
    adjust_text(annotations, arrowprops=dict(arrowstyle="->", color='black'))
    ax.axis("off")
    #fig.canvas.draw_idle()

def dessin(j, coor, img, alpha):
    global ax
    global fig
    w, h, _ = img.shape
    x_coor, y_coor = [], []
    for i in range(0, len(coor)-1, 2):
        x, y = float(coor[i]), float(coor[i+1])
        x_coor.append(x * h)
        y_coor.append(y * w)

    ax.scatter(x_coor, y_coor, s=1, alpha=alpha)
    ax.plot(x_coor, y_coor, color='black', zorder=1, alpha=alpha)
    ax.fill(x_coor, y_coor, color="black", alpha=alpha)
    annotation = ax.text(x_coor[0], y_coor[0], f'Label {j}', fontsize=9, ha='center', bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="white", alpha=alpha))
    fig.canvas.draw_idle()
    return annotation

def tracer_figure(path_files):
    global nb_label
    global coor 
    global image_rgb
    global fig
    global ax
    global slider_alpha
    
    if path_files.endswith('.txt'):
        lbl_pt = path_files
        img_pt = lbl_pt.replace('/labels', '/images').replace('txt', 'jpg')
    elif path_files.endswith('.jpg'):
        img_pt = path_files
        lbl_pt = img_pt.replace('/images', '/labels').replace('jpg', 'txt')
    else:
        raise ValueError
    
    coor = label_to_liste(lbl_pt)
    
    image = cv2.imread(img_pt)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    fig, ax = plt.subplots()
    fig.subplots_adjust(bottom=0.25)  
    alpha_init = 0.7 
    a_dessiner(alpha_init)
    ax.imshow(image_rgb)
    axfreq = fig.add_axes([0.25, 0.1, 0.65, 0.03])
    
    slider_alpha = Slider(ax=axfreq,label='Oppacité', valmin=0.1, valmax=1.0, valinit=alpha_init, valstep=0.1)
    slider_alpha.on_changed(mise_a_jour_graphique)
    plt.show()

你的代码问题在于你多次调用了 fig.canvas.draw_idle() ,而且在 a_dessiner 函数中的循环内部也调用了它。 这可能会干扰 matplotlib 的事件循环并阻止滑块正常工作。

以下是修改后的代码,删除了多余的 fig.canvas.draw_idle() 调用:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import cv2
# ... 其他函数定义 ...

def mise_a_jour_graphique(val):
    global fig
    alpha = slider_alpha.val
    a_dessiner(alpha)
    # 移除 fig.canvas.draw_idle()

def a_dessiner(alpha):
    global nb_label
    global coor
    global image_rgb
    global ax
    global fig
    annotations = []

    ax.clear()
    ax.imshow(image_rgb)  # Afficher l'image de fond

    for i, el in coor:
        annotation = dessin(i, el, image_rgb, alpha)
        # 移除 fig.canvas.draw_idle()
        annotations.append(annotation)

    nb_label = len(annotations)
    adjust_text(annotations, arrowprops=dict(arrowstyle="->", color='black'))
    ax.axis("off")
    # 移除 fig.canvas.draw_idle()

def dessin(j, coor, img, alpha):
    global ax
    global fig
    w, h, _ = img.shape
    x_coor, y_coor = [], []
    for i in range(0, len(coor)-1, 2):
        x, y = float(coor[i]), float(coor[i+1])
        x_coor.append(x * h)
        y_coor.append(y * w)

    ax.scatter(x_coor, y_coor, s=1, alpha=alpha)
    ax.plot(x_coor, y_coor, color='black', zorder=1, alpha=alpha)
    ax.fill(x_coor, y_coor, color="black", alpha=alpha)
    annotation = ax.text(x_coor[0], y_coor[0], f'Label {j}', fontsize=9, ha='center', bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="white", alpha=alpha))
    # 移除 fig.canvas.draw_idle()
    return annotation

def tracer_figure(path_files):
    global nb_label
    global coor 
    global image_rgb
    global fig
    global ax
    global slider_alpha

    # ... 其他代码 ...

    slider_alpha = Slider(ax=axfreq,label='Oppacité', valmin=0.1, valmax=1.0, valinit=alpha_init, valstep=0.1)
    slider_alpha.on_changed(mise_a_jour_graphique)
    plt.show()

通过只在 mise_a_jour_graphique 函数的末尾调用一次 fig.canvas.draw_idle() ,你就可以确保图形在滑块值改变后只更新一次,从而使滑块能够正常工作。

标签:python,python-3.x,slider,matplotlib-widget
From: 78778770

相关文章

  • 使用递归函数计算阶乘时,我在 python 中遇到类型错误
    defcalc_fact(n):如果(n==1或n==0):返回1别的:n*calc_fact(n-1)print(calc_fact(5))试图创建函数来计算阶乘,不支持类型错误操作数*:对于int或Nonetype我不知道为什么谢谢Python代码中出现“类型错误:不支持的操作数类型为*:'int'和'NoneType'”表明你......
  • 如何调试 python Flask [84] [CRITICAL] WORKER TIMEOUT?
    调试:gtts.tts:保存到temp.mp37月22日09:10:56PM[2024-07-2215:40:56+0000][84][严重]工作超时(pid:87)|||7月22日09:10:56PM[2024-07-2215:40:56+0000][87][INFO]工人退出(pid:87)7月22日09:10:57PM[2024-07-2215:40:57+0000][95][INF......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......
  • Python面试题:使用NumPy进行高效数组运算
    NumPy是Python中进行高效数组运算的基础库。以下是一些示例,展示了如何使用NumPy进行高效的数组运算,包括创建数组、数组操作、数学运算以及一些高级操作。安装NumPy如果你还没有安装NumPy,可以通过以下命令进行安装:pipinstallnumpy示例代码1.创建数组import......
  • Python面试题:使用Matplotlib和Seaborn进行数据可视化
    使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。安装Matplotlib和Seaborn如果你还没有安装这两个库,可以使用以下命令进行安装:pipins......