以下是解决方案之一(未必最佳方案),在此做个分享
介绍
在可视化后的图中,或许你想确定几个点的坐标,比较方便的方式是借助鼠标点击的位置来读取x、y坐标(如下图,pycharm的显示窗口/jupyter notebook借助魔法命令%matplotlib notebook实现交互式绘图)
网上也有一些鼠标拾取坐标的相关内容,但这里我尝试给出另一种拾取方式供大家参考:
本质上,该方法就是输入坐标并在图上画垂线来定位点。
但考虑到更改数值坐标非常麻烦,这里采用了追加移动指令的方式来更改定位线的位置,例如:
how='RRLluU' # 右右左左上上
若此时定位线还未移动至目标点,可以直接追加指令,不断进行微调
how='RRLluUddr' # 右右左左上上下下右
最终可以将全部点的坐标集合。
并根据获取的点坐标,制作一些蒙版:
优劣势
相较于鼠标点击的方式,这种方法非常的麻烦,效率低下。
但其仍然有着一些优点:
1. 定位线清晰准确,确保所选点的位置符合预期(虽然借助交互式也有移动标记物的方法。。。)
2. 可以复制移动指令,使得两组坐标集合中可以有完全重合的点。而单纯使用鼠标点击无法保证两次点击的位置一致(虽然可以不点,然后复制粘贴坐标。。。。)
3. 相较于直接修改数值坐标,追加字符的方式可以进一步提高效率
4. 坏了,这下没优点了(lll¬ω¬)
源码
函数收录于traffictools中(需要安装)。
当然,你可以直接copy以下源码,并配合使用手册使用:here(无须导入包)。该函数建议在jupyter notebook下使用,效率更高(因为需要反复多次运行)
import numpy as np
def here(ax, how: list[str], draw=True, p=0.01, alpha=0.3, color='#1f77b4', lw=1):
dy = ax.get_ylim()[1] - ax.get_ylim()[0]
dx = ax.get_xlim()[1] - ax.get_xlim()[0] # 获取图的尺寸
cy = (ax.get_ylim()[1] + ax.get_ylim()[0]) / 2
cx = (ax.get_xlim()[1] + ax.get_xlim()[0]) / 2 # 获取图的中点,作为初始定位点
action_label = ['U', 'u', 'D', 'd', 'R', 'r', 'L', 'l']
action_map = p * np.array([10, 1, -10, -1] * 2) # 不同指令对应的位移距离(比例)
locs = [] # 坐标集
for i in how:
action_count = np.array(list(map(lambda h: i.count(h), action_label))) # 统计how中各指令的数量
action = action_count * action_map * np.array([dy] * 4 + [dx] * 4) # 指令转换为移动距离
x = cx + np.sum(action[4:])
y = cy + np.sum(action[:4])
locs.append((x, y))
if draw:
for i in ax.get_children(): # 修改各要素不透明度
i.set_alpha(alpha)
for i in range(len(how)):
loc = locs[i]
ax.axhline(y=loc[1], color=color, lw=lw)
ax.axvline(x=loc[0], color=color, lw=lw)
ax.text(loc[0], loc[1], i)
return locs