python text控件如何通过鼠标拖动进行标记,matplotlib中的可拖动标记

下面是一个可拖动标记的示例,它始终显示直线上最近的点。在import numpy as np

import matplotlib.pyplot as plt

x = np.arange(60)

y = np.sin(x)*np.log(x+1)

fig, ax = plt.subplots()

ax.plot(x,y, marker="o", ms=4)

class DraggableMarker():

def __init__(self,ax=None, lines=None):

if ax == None:

self.ax = plt.gca()

else:

self.ax=ax

if lines==None:

self.lines=self.ax.lines

else:

self.lines=lines

self.lines = self.lines[:]

self.tx = [self.ax.text(0,0,"") for l in self.lines]

self.marker = [self.ax.plot([0],[0], marker="o", color="red")[0] for l in self.lines]

self.draggable=False

self.c1 = self.ax.figure.canvas.mpl_connect("button_press_event", self.click)

self.c2 = self.ax.figure.canvas.mpl_connect("button_release_event", self.release)

self.c3 = self.ax.figure.canvas.mpl_connect("motion_notify_event", self.drag)

def click(self,event):

if event.button==1:

#leftclick

self.draggable=True

self.update(event)

elif event.button==3:

self.draggable=False

[tx.set_visible(self.draggable) for tx in self.tx]

[m.set_visible(self.draggable) for m in self.marker]

ax.figure.canvas.draw_idle()

def drag(self, event):

if self.draggable:

self.update(event)

ax.figure.canvas.draw_idle()

def release(self,event):

self.draggable=False

def update(self, event):

for i, line in enumerate(self.lines):

x,y = self.get_closest(line, event.xdata)

self.tx[i].set_position((x,y))

self.tx[i].set_text("x:{}\ny:{}".format(x,y))

self.marker[i].set_data([x],[y])

def get_closest(self,line, mx):

x,y = line.get_data()

mini = np.argmin(np.abs(x-mx))

return x[mini], y[mini]

dm = DraggableMarker()

plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值