在显示下一个循环之前关闭的 for 循环中创建 pyplot 图(中间有一个交互函数)

Creating pyplot graphs in a for loop that close before the next is shown (with an interactive function in between)

我正在尝试通过遍历每个集合并选择是保留还是拒绝来手动整理数据集。为此,我想绘制一个数据集,使用点击模块(https://click.palletsprojects.com/en/7.x/)选择是否保留它,然后绘制下一个数据集并重复。目前,我可以绘制每组图并选择是否保存它,但问题是每张图都位于下一张图上方。我需要浏览数以千计的数据集,因此同时绘制它们是不可行的。

for q in np.arange(0,len(x)):

    Thing = Data[x[q]-100:x[q]+400]
  
    Thing2 = Data2[x[q]-100:x[q]+400]
        
    plt.plot(Thing)
    plt.plot(Thing2)
    plt.show()

    if click.confirm('Do you want to save?', default=True):
            List.append(x[q])

我看到其他人推荐 pyplot.ion 或 matplotlib 动画,但它们似乎都不起作用,可能是由于与“点击”输入框的交互出现。我只想在制作下一个情节之前关闭每个情节,但事实证明这是不可能的!

提前致谢。

解决方案必须清除当前图形并在已清除的图形上绘制新图形 canvas。有多种可行的方法,

中对此进行了很好的描述
  • How to update a plot in matplotlib?

由于您展示了两个图表,我首先提供一个适用于单个图表的解决方案。然后,我将展示一个适用于多行或多列的解决方案。


解决方案

单身

以下解决方案和测试代码用于更新单个图形,并合并您要保存的数据。

import click
import numpy as np
import matplotlib.pyplot as plt


def single(data, n_splits):
    """ Split up a dataset in n splits, and then combine the parts that you want to save.  """
    fig, ax = plt.subplots()
    results = []

    for thing in np.hsplit(data, n_splits):
        ax.cla()
        ax.plot(thing)
        fig.show()
        plt.pause(0.0001)

        if click.confirm('Do you want to save?', default=True):
            results.append(thing)

    plt.close(fig=fig)
    return np.hstack(results) if results else []

示例代码

if __name__ == '__main__':
    # Single data example
    data = np.random.randn(1000) * 10
    result = single(data, n_splits=2)

    fig, ax = plt.subplots()
    ax.plot(result)
    fig.show()
    plt.pause(5)

双人间

以下代码用于同时显示两个不同的图,使用子图。或者,您可以生成两个图形并分别绘制不同的图形。

def double(data, n_splits):
    """ Split up a dataset in n splits, and then combine the parts that you want to save.  """
    fig, axs = plt.subplots(nrows=2, squeeze=True)
    results = []

    for thing_1, thing_2 in np.hsplit(data, n_splits):

        for ax, thing in zip(axs, [thing_1, thing_2]):
            ax.cla()
            ax.plot(thing)

        fig.show()
        plt.pause(0.0001)

        if click.confirm('Do you want to save?', default=True):
            results.append([thing_1, thing_2])

    plt.close(fig=fig)
    return np.hstack(results) if results else []

示例代码

if __name__ == '__main__':
    # Multiple plots example
    data = np.random.randn(2, 1000) * 10
    results = double(data, n_splits=2)

    fig, axs = plt.subplots(nrows=2, squeeze=True)
    for result, ax in zip(results, axs):
        ax.plot(result)

    fig.show()
    plt.pause(5)