更新 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()
这是我第一次在 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()