创建新的绘图以在循环中获取用户输入,并保持另一个绘图处于打开状态以使用matplotlib更新统计信息

2024-10-01 22:31:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决的问题如下:我想迭代创建用户可以交互的新绘图(例如,单击子绘图以将答案标记为正确),以及一个从用户输入更新统计信息的绘图。让我们把前者叫做Plot A,把后者叫做Plot B

具体而言:

  • Plot A包含从给定输入生成的一组子批次,提示用户选择一个子批次Plot A将在每次我们收到新的输入文件时创建,并在用户完成选择后由用户关闭,然后在Plot B上更新其答案。我编写了一个事件处理程序并将其附加到Plot A以记录鼠标单击
  • Plot B在第一次用户输入后显示,将保持打开状态,并且每当我们从Plot A收到新的用户输入时,统计信息都将更新

由于我正在执行的程序有几个类(PlotA由一个类创建,而PlotB由另一个类创建),因此我将用以下简单管道对其进行总结:

for new input X from folder:
    plotA(X)  # new plot is created for an input X, user clicks on subplots in plotA
    update_plotB()

其中:

def plotA(X):
    # do computation on X
    fig, ax = plt.subplots(nrows..., ncols=..., figsize=(...))
    ...plotting stuff...
    plt.show()

def update_plotB():
    fig, ax = plt.subplots(num='plotB', ncols=..., nrows=..., figsize=...)  # I set an ID for plotB
    for row, col:
         ax[row, col].plot(...)   # update the statistics in each subplot
    plt.show()

因此,我希望为每个新输入创建一个新的PlotA,阻止程序,直到用户自己关闭绘图,然后用新答案更新/重新绘制PlotB中的子绘图

到目前为止,我已经尝试了(在阅读了大量关于so的主题之后):

(1) 使用plt.ion()

我把plt.ion()放在节目的开头。但是它一次显示了每个绘图,而没有阻止用户在PlotA中输入程序(代码运行太快,程序在我看到任何绘图之前就结束了)

(2) 在update_plotB()

中使用plt.show(block=False)

这只工作了一次(也就是说,在第一次迭代中显示PlotB而没有阻塞),但是在接下来的所有迭代中PlotB阻塞-我觉得很奇怪,但不知道为什么

(3) 用{}或{}(不带{})替换{}中的{}

PlotB阻塞执行直到我关闭它,然后在每次迭代中创建新的PlotB


我希望我已经解释清楚了。提前非常感谢


Tags: 答案用户程序绘图forplotshowupdate

热门问题