Package: dynamic-plt
类说明Plt 类说明Plt 类是基于matplotlib二次封装的。主要功能有通过鼠标键盘控制显示，绑定事件参数说明window_size: 窗口大小is_dynamic_drawing: 滚动显示is_interact_with: 元素交互成员变量说明canvas:  画布成员函数说明add_sub_axes:  添加子图add_sub_axes(ax: Axes = None, *args, **kwargs) -> Axes:参数说明axAexes对象。默认None，自动创建kwargs参数:rect 子图位置is_dynamic_drawing 是否自动滚动显示is_interact_with 是否允许交互get_is_pause: 动态画图状态get_is_pause():set_ax: 设置当前处理的axesset_ax(ax: Axes):参数说明axAxes对象get_data: 获取指定位置的数据，默认获取当前帧数据参数说明index索引get_next_data: 获取下帧数get_last_data: 获取上一帧数据add_sub_axes: 添加子图参数说明is_dynamically_drawn是否为动态更新的子图rect子图的位置和大小tuple (left, bottom, width, height)update_data: 添加数据到数据中心mpl_connect: plt的事件绑定方法- 'key_mouse_event' : 注册设备事件类
- 'key_press_event' : 键盘按键按下事件
- 'key_release_event' : 键盘按键抬起事件
- 'button_press_event' : 鼠标按键按下事件
- 'button_release_event' : 鼠标按键抬起事件
- 'motion_notify_event' : 鼠标移动事件
- 'scroll_event' : 鼠标滚轮事件
- 'draw_event' : 画图的事件
- 'pick_event' ： 鼠标拾取事件
- 'resize_event' ： plt图大小变化事件
- 'figure_enter_event' ： 鼠标进入事件
- 'figure_leave_event' ： 鼠标离开事件
- 'axes_enter_event' ： 坐标轴对象上鼠标进入事件
- 'axes_leave_event' ： 坐标轴对象上鼠标离开事件continuous_draw: 动态画图方法参数说明sleep_interval动态画图事件间隔，默认1sdraw: 静态画图方法show: 运行窗口data_iterators:  获取数据parsed_data:   解析数据参数说明data数据中心传进来的数据data_iterators返回的数据结构draw_geometric_type:  添加要绘制的元素对象with_function:  画图方法continuous_draw和draw调用一个on_pick:    元素交互事件触发函数-参考：https://matplotlib.org/3.8.1/users/explain/figure/event_handling.html#event-handling-and-picking窗口扩展可以使用tkinter对窗口扩展。root: 主窗口对象例子必须继承Plt类必须重写一下函数data_iterators:  获取数据处理parsed_data:   解析数据draw_geometric_type:  添加要绘制的元素对象with_function:  画图方法on_pick:    元素交互事件触发函数fromPlt.PlotimportPlt,DraggablePlotimportosimportrandomfromPlt.Core.Colorimportrandom_color_array# 随机获取颜色color_set=random_color_array(50,"hex")# 使用交互事件必须继承 DraggablePlot 类classTestDraggablePlot(DraggablePlot):# 使用鼠标按下事件，需要重写此方法，并且调用基类方法defon_press(self,event):super().on_press(event)self.plt.test_draggable()# 使用鼠标弹起事件，需要重写此方法，并且调用基类方法defon_release(self,event):super().on_release(event)# 使用鼠标滑轮事件，需要重写此方法，并且调用基类方法defon_scroll(self,event):super().on_scroll(event)# 使用键盘按键事件，需要重写此方法，并且调用基类方法defon_key(self,event):super().on_key(event)classTestMapShow(Plt):def__init__(self):super().__init__(window_size=(8,4),is_dynamic_drawing=False,is_interact_with=False)# 添加子图left,bottom,width,height=0.1,0.1,0.8,0.8self.ax1=self.add_sub_axes(True,[left,bottom,width,height])# 存放处理好的数据self.data=[]# 绑定设备触发类self.mpl_connect("key_mouse_event",TestDraggablePlot)defdata_iterators(self):# 文件目录file_path=os.path.join(os.path.dirname(__file__),"test/test_data")# 排序file_name=sorted(os.listdir(file_path))# 路径拼接file_path=map(lambdax:os.path.join(file_path,x),file_name)foriinfile_path:# 获取文件名file_name=os.path.basename(i)# 读取文件data=self.get_json_data(i)# 迭代器返回数据yielddata,file_namedefparsed_data(self,data):# 判断是否有数据ifdataisnotNone:return# 解析数据data,file_name=dataself.title_label=file_nameforiindata:lane={"dir":i["dir"],"num":i["num"],"lx":[],"ly":[],"rx":[],"ry":[]}forptini["left_points"]:lane["lx"].append(pt["x"])lane["ly"].append(pt["y"])forptini["right_points"]:lane["rx"].append(pt["x"])lane["ry"].append(pt["y"])self.data.append(lane)# 在子图中添加要画的几何defdraw_geometric_type(self):foridx,iinenumerate(self.data):self.ax1_max_xaxis=max(max(i["lx"]),self.ax1_max_xaxis)self.ax1.plot(i["ly"],i["lx"],color=color_set[idx])self.ax1.plot(i["ry"],i["rx"],color=color_set[idx])dir_text_x=(i["ly"][0]+i["ry"][0])/2dir_text_y=(i["lx"][0]+i["lx"][-1])/2self.ax1.text(dir_text_x,dir_text_y,i["dir"],color=color_set[idx])self.ax1.text(dir_text_x,dir_text_y-5,i["num"],color=color_set[idx])# 动态画图一直要记得清理数据self.data.clear()# 处理画图的函数defwith_function(self):self.continuous_draw(1)pass# 对元素的交互defon_pick(self,event):# 改变颜色event.artist.set_color(random.choice(color_set))# 设置图例的标签defset_label(self):self.ax1.invert_xaxis()self.ax1.set_xticks(self.generate_range(end=(self.ax1_max_xaxis/2),step=5)[::-1])self.ax1.set_title(self.title_label)deftest_draggable(self):print("被触发啦")if__name__=='__main__':# 实例化live_plot=TestMapShow()# 运行live_plot.run()