简单高效的Python数组可视化
主要内容
- 介绍
- 实现方式
- 整体代码
介绍
- 在遇到一些涉及到数组的算法中(例如排序、或者说是统计),数组的可视化能够给我们提供一种更加直观的视角来找到自己程序的Bug(或者是学习某些算法的实现原理)。
- 在这里介绍的是一份我写于提供给初学者的数组可视化类,其中我为了降低难度和减少成本,因此阉割了很多次要内容。
- 在这份代码中我提供了对应的接口,可以让其他程序员直接导入我的代码文件后进行拓展。
实现方式
1 目标
- 对数组进行可视化展示
2 实现原理
- 使用 Matplotlib 将数组的索引作为
x
x
x轴,对应的数值作为
y
y
y轴,然后绘制成直方图。
3 具体实现
- 所用到的库为
import matplotlib.pyplot as plt
3.1 初始化
- 在这里使用 plt.subplots() 方法来初始化一张画布,同时将返回的 fig 与 ax 变量储存在类中进行封装,方便后续拓展。
class VisualArray(): """动态可视化数组""" def __init__(self): """初始化""" self.fig,self.ax = plt.subplots()
3.2 绘制图像
- 绘制图表的方法为擦除上一帧的图像,然后绘制出下一帧的图像。
- 在这里使用的是 bar 方法来进行绘制,同时将一些基础的显示参数引出方便程序员调整效果。
def draw(self,arrays=[],rwidth=0.8,color='black',time=0.0001): """ 生成一帧图像 arrays: 需要显示的数组 rwidth: 直方图中的条宽 color: 直方图的颜色 time: 延迟,默认为0.1ms axis: 是否显示坐标轴 """ self.ax.cla() # 清除上一帧图像 self.ax.bar(range(0,len(arrays)), height=arrays, width=rwidth,color=color) plt.pause(time) #暂停,防止速度太快无法
3.3 停止绘画
- 默认情况下动图绘画完后便会消失,因此若要保留最后一帧图像或者是提前结束动画,可以使用 plt.show() ,在此为了方便,也特意将该功能封装为一个方法。
def stop(self): """结束绘画,使图片保留在最后一帧""" plt.show()
3.4 分析
- 这是一个无记忆性的抽象数据类型,即这个可视化类中每一帧并不会受之前显示内容的影响(虽然你看起来好像是有影响)。因此空间成本为常数级别。
- 对于除了 ax.bar() 方法受数组影响较大外,其余语句都能在常数时间下完成,因此单独对该方法进行分析,在固定数组大小的情况下有:
能够看出除了等频率出现的尖点外,其他时候的时间成本都为常数级别。 - 对动态变化的数组进行分析,有:
在排除异常点的干扰后,动态数组的情况下的时间成本为线性级别。
完整代码
- 你可以将这个代码单独存在一个.py中然后进行调用,只需要在调用代码的文件上面写上这个就好了
注意的是,两个代码文件要放在同一个文件中!import 代码名称
-
#ArrayVisual.py import matplotlib.pyplot as plt class VisualArray(): """动态可视化数组""" def __init__(self): """初始化""" self.fig,self.ax = plt.subplots() def draw(self,arrays=[],rwidth=0.8,color='black',time=0.0001): """ 生成一帧图像 arrays: 需要显示的数组 rwidth: 直方图中的条宽 color: 直方图的颜色 time: 延迟,默认为0.1ms axis: 是否显示坐标轴 """ self.ax.cla() # 清除键 self.ax.bar(range(0,len(arrays)), height=arrays, width=rwidth,color=color) plt.pause(time) def stop(self): """结束绘画,使图片保留在最后一帧""" plt.show()