# dynamic_plt **Repository Path**: xiang-dong/dynamic ## Basic Information - **Project Name**: dynamic_plt - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-14 - **Last Updated**: 2023-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 打包方法 ```shell python setup.py sdist ``` # 类说明 ## Plt 类说明 Plt 类是基于matplotlib二次封装的。 主要功能有通过鼠标键盘控制显示,绑定事件 ### 参数说明 ``window_size``: 窗口大小 ``is_dynamic_drawing``: 滚动显示 ``is_interact_with``: 元素交互 ### 成员变量说明 ``canvas``: 画布 ### 成员函数说明 #### ``add_sub_axes``: 添加子图 add_sub_axes(ax: Axes = None, *args, **kwargs) -> Axes: | 参数 | 说明 | |--------|-------------------------------------------------------------------------------------------------------| | ax | Aexes对象。默认None,自动创建 | | kwargs | 参数:
rect 子图位置
is_dynamic_drawing 是否自动滚动显示
is_interact_with 是否允许交互 | #### ``get_is_pause``: 动态画图状态 get_is_pause(): #### ``set_ax``: 设置当前处理的axes set_ax(ax: Axes): | 参数 | 说明 | |----|--------| | ax | Axes对象 | #### ``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 | 动态画图事件间隔,默认1s | ``draw``: 静态画图方法 ``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``: 主窗口对象 ## 例子 1. 必须继承Plt类 2. 必须重写一下函数 1. ``data_iterators``: 获取数据处理 2. ``parsed_data``: 解析数据 3. ``draw_geometric_type``: 添加要绘制的元素对象 4. ``with_function``: 画图方法 5. ``on_pick``: 元素交互事件触发函数 ```python3 from Plt.Plot import Plt, DraggablePlot import os import random from Plt.Core.Color import random_color_array # 随机获取颜色 color_set = random_color_array(50, "hex") # 使用交互事件必须继承 DraggablePlot 类 class TestDraggablePlot(DraggablePlot): # 使用鼠标按下事件,需要重写此方法,并且调用基类方法 def on_press(self, event): super().on_press(event) self.plt.test_draggable() # 使用鼠标弹起事件,需要重写此方法,并且调用基类方法 def on_release(self, event): super().on_release(event) # 使用鼠标滑轮事件,需要重写此方法,并且调用基类方法 def on_scroll(self, event): super().on_scroll(event) # 使用键盘按键事件,需要重写此方法,并且调用基类方法 def on_key(self, event): super().on_key(event) class TestMapShow(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.8 self.ax1 = self.add_sub_axes(True, [left, bottom, width, height]) # 存放处理好的数据 self.data = [] # 绑定设备触发类 self.mpl_connect("key_mouse_event", TestDraggablePlot) def data_iterators(self): # 文件目录 file_path = os.path.join(os.path.dirname(__file__), "test/test_data") # 排序 file_name = sorted(os.listdir(file_path)) # 路径拼接 file_path = map(lambda x: os.path.join(file_path, x), file_name) for i in file_path: # 获取文件名 file_name = os.path.basename(i) # 读取文件 data = self.get_json_data(i) # 迭代器返回数据 yield data, file_name def parsed_data(self, data): # 判断是否有数据 if data is not None: return # 解析数据 data, file_name = data self.title_label = file_name for i in data: lane = {"dir": i["dir"], "num": i["num"], "lx": [], "ly": [], "rx": [], "ry": []} for pt in i["left_points"]: lane["lx"].append(pt["x"]) lane["ly"].append(pt["y"]) for pt in i["right_points"]: lane["rx"].append(pt["x"]) lane["ry"].append(pt["y"]) self.data.append(lane) # 在子图中添加要画的几何 def draw_geometric_type(self): for idx, i in enumerate(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]) / 2 dir_text_y = (i["lx"][0] + i["lx"][-1]) / 2 self.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() # 处理画图的函数 def with_function(self): self.continuous_draw(1) pass # 对元素的交互 def on_pick(self, event): # 改变颜色 event.artist.set_color(random.choice(color_set)) # 设置图例的标签 def set_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) def test_draggable(self): print("被触发啦") if __name__ == '__main__': # 实例化 live_plot = TestMapShow() # 运行 live_plot.run() ```