暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于python排序算法可视化二

追梦IT人 2020-02-06
1699

关于排序算法可视化只是简单在原来代码后追加了十几行代码,排序算法的可视化重要的是matplotlib.animation.FuncAnimation函数,该函数有几个重要的参数,一个是图表面板,一个是动画播放回调函数,一个数据帧,一个是初始化函数。

关键在于数据帧这一块,一种办法是生成所有待播放的数据,形成数据数组,然后在动画播放回调函数中进行播放,另外一种办法是使用数据迭代器,一边生成数据,一边交给回到函数进行播放。第一种容易理解一些,第二种函数和数据解耦不大容易。

可视化的另一个问题是对于matplotlib各种组件的对象和方法要熟悉,本文只是简单做一下尝试。


代码示例

  1. import random

  2. import copy

  3. import numpy as np

  4. import matplotlib.pyplot as plt

  5. from matplotlib.animation import FuncAnimation


  6. def init_sortdata(datarage=10,datanum=10):

  7. data = list(range(1,datarage+1))

  8. data = random.sample(data, k=datanum)

  9. return data


  10. #计算时间函数

  11. def print_run_time(func):

  12. def wrapper(*args, **kw):

  13. start_time = time.time() # 程序开始时间

  14. ret=func(*args, **kw) # 将被装饰函数的返回值接收

  15. end_time = time.time() # 程序结束时间

  16. total_time = int(1000*(end_time - start_time)) #程序执行时间,毫秒计

  17. print('{}排序算法共计执行{}豪秒,开始时间为{},结束时间为{}'.format(func.__name__,total_time,start_time,end_time))

  18. return ret # 返回被装饰函数的返回值

  19. return wrapper


  20. class SortClass:

  21. def __init__(self,collection):

  22. self.collection=collection


  23. def swapAndDraw(self,tempbar, x1, x2):

  24. #tempbar <BarContainer object of X artists>

  25. #tempbar[x1] Rectangle(xy=(9.6, 0), width=0.8, height=98, angle=0) 对象

  26. temp1height = tempbar[x1].get_height() #获取待交换图像x1的高度,写入临时变量

  27. tempbar[x1].set_height(tempbar[x2].get_height()) #将x1的高度置为x2的高度

  28. tempbar[x2].set_height(temp1height) #将x2的高度置为x1的高度

  29. tempbar[x2].set_fc("red") #将要交换的x2置为红色标志

  30. plt.draw() #绘制图形

  31. plt.pause(0.1) #为体现动画,设置延迟时间为0.1

  32. tempbar[x2].set_fc("green") #再将要交换的x2重置为绿色标志


  33. @print_run_time

  34. def bubble_sort(self):

  35. #冒泡排序,数据来自类的初始化,为了不改变源list数据,采用深拷贝方式

  36. dataset = copy.deepcopy(self.collection)

  37. stepdata=[]

  38. length = len(dataset) #list长度

  39. runtimes=0 #交换次数

  40. looptimes=0 #循环次数

  41. print('原始数据=',dataset) #记录原始数据

  42. plt.figure('bubble_sort')

  43. plt.title('bubble_sort')

  44. plt.xticks(range(0,length), rotation=45) #进行X轴设置

  45. tempbar = plt.bar(range(length), dataset, fc="green") #初始化元数据

  46. for i in range(length - 1):

  47. print(' 第{}轮外轮,开始数据={}'.format(i, dataset))

  48. swapped = False

  49. for j in range(length - 1 - i):

  50. if dataset[j] > dataset[j + 1]: #相邻元素间交叉判断

  51. swapped = True

  52. runtimes=runtimes+1 #记录交换次数

  53. dataset[j], dataset[j + 1] = dataset[j + 1], dataset[j] #数据交换

  54. stepdata.append(dataset.copy()) #

  55. self.swapAndDraw(tempbar, j, j + 1) #绘制动画图

  56. looptimes=looptimes+1 #记录循环次数

  57. print(' 第{}轮内轮,中间数据={}'.format(j, dataset)) #记录内轮中间数据

  58. if not swapped:

  59. break

  60. print(' 第{}轮外轮,结束数据={}'.format(i,dataset)) #记录外轮中间数据

  61. print('最终数据=', dataset) #记录最终数据

  62. plt.ioff()

  63. return looptimes,runtimes,dataset,stepdata


  64. if __name__ == "__main__":

  65. import time

  66. orgdata=init_sortdata(100,8)

  67. asort=SortClass(orgdata)

  68. looptimes,runtime,sortdata,stepdata=asort.bubble_sort()

  69. print('排序前的数据为{}'.format(orgdata))

  70. print('排序后的数据为{}'.format(sortdata))

  71. print('循环次数={}'.format(looptimes))

  72. print('交换次数={}'.format(runtime))

  73. print('stepdata={}'.format(stepdata))


  1. #matplotlib动画过程实际上是重构当前帧中图表对象的过程

  2. def animate(frame):

  3. for rect, y in zip(bars, stepdata[frame]): #遍历当前的bars中的rect和数据

  4. rect.set_height(y) #重置每一个bar条的高度

  5. return bars


  6. frames=len(stepdata) #从步骤数据中获取排序帧数

  7. xrange=range(len(orgdata)) #获取bar条的x布局

  8. fig = plt.figure(2, figsize=(6, 4)) #初始化fig

  9. plt.title('bubble_sort')

  10. plt.xticks(range(0, len(orgdata)), rotation=45) # 进行X轴设置

  11. bars = plt.bar(xrange, stepdata[0], 0.5) #初始化bars

  12. #fig

  13. anim = FuncAnimation(fig, animate, frames=frames, interval=200, repeat=False) #实现动画

  14. plt.show()




最后修改时间:2020-02-07 09:50:24
文章转载自追梦IT人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论