更新 Python 中的绘图更快,而不是使用 plot.pause()

Updating a plot in Python faster, not using plot.pause()

这是我第一次在 Whosebug 上发帖,所以我会尽力解释我的问题。

我正在尝试编写一个代码,通过绘制不同排序算法的工作原理来显示。为此,我绘制了算法执行的每一步,因此每次我需要更新我的图表以显示它。我的代码可以在下面看到。目前我正在使用 plt.cla()、plt.draw() 和 plt.pause() 来做到这一点,如 'def Bubble_sort()' 下所示。但是如果有一个大数组排序,这就很慢了!

我确实尝试寻找不同的方法,我发现使用 figure.canvas.draw()、figure.canvas.update() 等可以加快进程。我试图在 'def Bubble_sort_fast' 中应用它,但我无法让它工作......而且当我尝试它时,我得到错误:

AttributeError: 'FigureCanvasTkAgg' object has no attribute 'update'

我看到一些事情可能是由于我正在使用的 'backend' TkAgg,但尝试其他人,如 Qt4Agg 或其他,我收到导入错误。

如果你们能帮助我,那就太好了!如果您缺少信息,请告诉我!

import random
from matplotlib import pyplot as plt
import numpy as np

end = 100
x = np.array(range(0,end+1))
y = np.array(range(0,end+1))
random.shuffle(y)

def Bubble_sort():
    plt.figure()
    plt.bar(x,y,color='blue')

    sorted = False
    while not sorted:
        for j in range(0,len(x)):
            for i in range(1,len(x)):
                if y[i-1] > y[i]:
                    y[i-1], y[i] = y[i],y[i-1]
                    plt.cla()
                    plt.bar(x,y,color='blue')
                    plt.bar(x[i],y[i],color='red')
                    plt.draw()
                    plt.pause(.01)

        for k in range(1,len(x)+1):
            plt.cla()
            plt.bar(x, y, color='blue')
            plt.bar(x[:k], y[:k], color='#63f542')
            plt.pause(0.01)
            if k == len(x):
                sorted = True

    plt.bar(x,y,color='#63f542')
    plt.show()

def Bubble_sort_fast():
    fig, ax = plt.subplots()
    barz = ax.bar(x, y, 0.95, color='blue')
    fig.canvas.draw()
    plt.show(block=False)

    sorted = False
    while not sorted:
        for j in range(0, len(x)):
            for i in range(1, len(x)):
                if y[i - 1] > y[i]:
                    y[i - 1], y[i] = y[i], y[i - 1]
                    fig.canvas.update()
                    fig.canvas.flush_events()

        for k in range(1,len(x)+1):
            plt.cla()
            plt.bar(x, y, color='blue')
            plt.bar(x[:k], y[:k], color='#63f542')
            plt.pause(0.01)
            if k == len(x):
                sorted = True

    plt.bar(x, y, color='#63f542')
    plt.show()

Bubble_sort()
# Bubble_sort_fast()

人们会使用 FuncAnimation 制作此类动画。在这种情况下,它可能看起来像

import numpy as np
import random
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation

end = 100
x = np.array(range(0,end+1))
y = np.array(range(0,end+1))
random.shuffle(y)


fig, ax = plt.subplots()
bars = ax.bar(x,y,color='blue')

def update(y, i=None, k=None):
    for yi, bar in zip(y,bars):
        bar.set_height(yi)
        bar.set_facecolor("blue")
    if i is not None:
        bars[i].set_facecolor("red")
    if k is not None:
        for l in range(k):
            bars[l].set_facecolor('#63f542')

def gen():
    sorted = False
    while not sorted:
        for j in range(0,len(x)):
            for i in range(1,len(x)):
                if y[i-1] > y[i]:
                    y[i-1], y[i] = y[i],y[i-1]
                    yield (y, i, None)

        for k in range(1,len(x)+1):
            yield (y, None, k)

            if k == len(x):
                sorted = True
    ani.event_source.stop()
    yield (y, None, k)


def animate(args):
    update(*args)
    return bars

ani =  FuncAnimation(fig, animate, frames=gen, repeat=False, interval=15, blit=True)  

plt.show()