目视+手操拾取图上的点坐标(matplotlib)

以下是解决方案之一(未必最佳方案),在此做个分享

介绍

在可视化后的图中,或许你想确定几个点的坐标,比较方便的方式是借助鼠标点击的位置来读取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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值