python matplotlib排序画图初探之简单bar实时动态更新(非animation、非opencv)

最近回顾学习排序,想用python实现,考虑可视化github上有一个python得https://github.com/ZQPei/Sorting_Visualization

还不错。

不过有用到opencv、pygame,我不太想用这个,看是否能直接用matplotlib画,有两种思路:①animation动画思路、②自己手动draw。

这一篇是自己探索的第②种,自己手动draw得方式


注意点:

①ipython中无法动态实时更新,python console中才可以,使过一直都是空白,等代码全都执行完毕,才会显示最后得一张图,坑掉我无数实践

②实时动态,使用plt.pause(seconds)方式非阻塞刷新draw;(资料说需要开启交互方式plt.ion()  用完需关闭plt.ioff(),但测试并不是)

③最后可用plt.show()来阻塞,防止运行玩自己关闭了。


自己draw动态更新

plt.bar柱状图,当排序交换数据时,将柱状图中的height数据进行交换,然后draw即可


源码:(一定是python console,不是ipython,否则会生成很多得图片输出)

# -*- coding: utf-8 -*-
"""
Created on Sun Jul 21 00:32:06 2019
pyplot_dynamic_draw_sample_01.py
在ipython中无法体现出动态效果,需要再window得cmd中启动pyton(linux也是一样console启动),然后输入下面得文件就能看到效果
@author: Sudaxia
"""
#matplotline   #jupyter ipython中别加inline就能画图出来
import matplotlib.pyplot as plt
import random

#plt.ion()
plt.ioff()

def swapAndDraw(data,x1,x2):
    temp1height=tempbar[x1].get_height()
    tempbar[x1].set_height(tempbar[x2].get_height())
    tempbar[x2].set_height(temp1height)
    tempbar[x2].set_fc("red")
    plt.draw()
    plt.pause(0.001)
    tempbar[x2].set_fc("green")#记得颜色换回来


#冒泡排序
data=random.sample(range(20),20)
print data
n=len(data)
tempbar=plt.bar(range(n),data,fc="green")
for m in range(n):#趟数
    for i in range(n-m-1):
        if data[i]>data[i+1]:
            data[i+1],data[i]=data[i],data[i+1]
            #print "data:\t",data
            swapAndDraw(data,i,i+1)
            #print "bar:\t",[x.get_height() for x in tempbar]


print data;
plt.ioff();
#plt.show();




效果:因为保存为gif又涉及到其它,我就只贴结果图了,代码运行就知道了

python matplotlib排序画图初探之简单bar实时动态更新(非animation、非opencv)_第1张图片

 

下一篇讲解animation动画排序展示,并保存文件

 

你可能感兴趣的:(python)