# 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()
```