2017-06-21 127 views
0

此图为什么,我想实现:添加光标matplotlib

我正在寻找一个解决方案光标添加到我的绘制线matplotlib。光标应该是可拖动的,但只能在绘制的线上移动。标签应显示轨迹上标记点的实际值。

我不知道哪个对象用作此游标/标记。

回答

1

还有就是matplotlib页面,您可以调整,以显示在感兴趣的位置的点上的例子。

import matplotlib.pyplot as plt 
import matplotlib.widgets as widgets 
import numpy as np 



class SnaptoCursor(object): 
    def __init__(self, ax, x, y): 
     self.ax = ax 
     self.ly = ax.axvline(color='k', alpha=0.2) # the vert line 
     self.marker, = ax.plot([0],[0], marker="o", color="crimson", zorder=3) 
     self.x = x 
     self.y = y 
     self.txt = ax.text(0.7, 0.9, '') 

    def mouse_move(self, event): 
     if not event.inaxes: return 
     x, y = event.xdata, event.ydata 
     indx = np.searchsorted(self.x, [x])[0] 
     x = self.x[indx] 
     y = self.y[indx] 
     self.ly.set_xdata(x) 
     self.marker.set_data([x],[y]) 
     self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y)) 
     self.txt.set_position((x,y)) 
     self.ax.figure.canvas.draw_idle() 

t = np.arange(0.0, 1.0, 0.01) 
s = np.sin(2*2*np.pi*t) 
fig, ax = plt.subplots() 

#cursor = Cursor(ax) 
cursor = SnaptoCursor(ax, t, s) 
cid = plt.connect('motion_notify_event', cursor.mouse_move) 

ax.plot(t, s,) 
plt.axis([0, 1, -1, 1]) 
plt.show() 

enter image description here

+0

太好了,谢谢!但是如何将这个光标添加到已经绘制的线上?我找不到解决方案以后绘制光标... – MartinaW

+0

在上面的代码中,Cursor ** **之后添加**。你到底什么意思? – ImportanceOfBeingErnest

+0

你太棒了!非常感谢!该解决方案适合我! – MartinaW

0

看这里:Is there a matplotlib equivalent of MATLAB's datacursormode?

import matplotlib.pyplot as plt 

class DataCursor(object): 
    text_template = 'x: %0.2f\ny: %0.2f' 
    x, y = 0.0, 0.0 
    xoffset, yoffset = -20, 20 
    text_template = 'x: %0.2f\ny: %0.2f' 

    def __init__(self, ax): 
     self.ax = ax 
     self.annotation = ax.annotate(self.text_template, 
       xy=(self.x, self.y), xytext=(self.xoffset, self.yoffset), 
       textcoords='offset points', ha='right', va='bottom', 
       bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5), 
       arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0') 
       ) 
     self.annotation.set_visible(False) 

    def __call__(self, event): 
     self.event = event 
     # xdata, ydata = event.artist.get_data() 
     # self.x, self.y = xdata[event.ind], ydata[event.ind] 
     self.x, self.y = event.mouseevent.xdata, event.mouseevent.ydata 
     if self.x is not None: 
      self.annotation.xy = self.x, self.y 
      self.annotation.set_text(self.text_template % (self.x, self.y)) 
      self.annotation.set_visible(True) 
      event.canvas.draw() 

fig = plt.figure() 
line, = plt.plot(range(10), 'ro-') 
fig.canvas.mpl_connect('pick_event', DataCursor(plt.gca())) 
line.set_picker(5) # Tolerance in points 
plt.show() 
+1

所示的位置取决于你点击。我想你应该拿实际的数据来确定显示的坐标。 – ImportanceOfBeingErnest