2010-12-15 27 views
10

Bazı çizgi parçalarına (LineCollection) ve bazı noktalara sahip bir grafikim var. Bu çizgiler ve noktalar, onlarla ilişkili olmayan, grafik olmayan bazı değerlere sahiptir. Nokta ve çizgi için ilgili değeri kolayca bulmak için bir fare-over araç ipucu veya başka bir yöntem ekleyebilmek istiyorum. Bu nokta veya çizgi segmentleri için mümkün mü?Matplotlib'deki nokta ve çizgi araç ipuçları?

+2

([Burada matplotlib itibaren bir örnek] http://matplotlib.sourceforge.net/ Google'da bulduğum örnekler/pylab_examples/cursor_demo.html). [İşte bir başka popüler SO cevabı.] (Http://stackoverflow.com/a/4674445/1020470) [Peki, bu da matplotlib örneğini işaret eder.] (Http://stackoverflow.com/ a/7909589/1020470) –

cevap

6

puan için, ben bir yol bulduk, ancak WX arka uç

"""Example of how to use wx tooltips on a matplotlib figure window. 
Adapted from http://osdir.com/ml/python.matplotlib.devel/2006-09/msg00048.html""" 

import matplotlib as mpl 
mpl.use('WXAgg') 
mpl.interactive(False) 

import pylab as pl 
from pylab import get_current_fig_manager as gcfm 
import wx 
import numpy as np 
import random 


class wxToolTipExample(object): 
    def __init__(self): 
     self.figure = pl.figure() 
     self.axis = self.figure.add_subplot(111) 

     # create a long tooltip with newline to get around wx bug (in v2.6.3.3) 
     # where newlines aren't recognized on subsequent self.tooltip.SetTip() calls 
     self.tooltip = wx.ToolTip(tip='tip with a long %s line and a newline\n' % (' '*100)) 
     gcfm().canvas.SetToolTip(self.tooltip) 
     self.tooltip.Enable(False) 
     self.tooltip.SetDelay(0) 
     self.figure.canvas.mpl_connect('motion_notify_event', self._onMotion) 

     self.dataX = np.arange(0, 100) 
     self.dataY = [random.random()*100.0 for x in xrange(len(self.dataX))] 
     self.axis.plot(self.dataX, self.dataY, linestyle='-', marker='o', markersize=10, label='myplot') 

    def _onMotion(self, event): 
     collisionFound = False 
     if event.xdata != None and event.ydata != None: # mouse is inside the axes 
      for i in xrange(len(self.dataX)): 
       radius = 1 
       if abs(event.xdata - self.dataX[i]) < radius and abs(event.ydata - self.dataY[i]) < radius: 
        top = tip='x=%f\ny=%f' % (event.xdata, event.ydata) 
        self.tooltip.SetTip(tip) 
        self.tooltip.Enable(True) 
        collisionFound = True 
        break 
     if not collisionFound: 
      self.tooltip.Enable(False) 



example = wxToolTipExample() 
pl.show() 
+1

Daha genel olarak bileşenler için böyle bir özelliği desteklemiş olsaydı çok güzel olurdu. – aestrivex

1

Belki this recipe bir varyasyon puan için istediğini yapacağını kullanmak zorunda? En azından wx arka ucuyla sınırlı değil.

2

Bu eski iplik, ama durumda herkes hatlarına ipuçlarını nasıl ekleneceği arıyor, bu çalışır:

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

f, ax = plt.subplots() 
x1 = np.array([0,100], int) 
x2 = np.array([10,110], int) 
y = np.array([0,100], int) 

line = ax.plot(x1, y) 
mpld3.plugins.connect(f, mpld3.plugins.LineLabelTooltip(line[0], label='label 1')) 

line = ax.plot(x2, y) 
mpld3.plugins.connect(f, mpld3.plugins.LineLabelTooltip(line[0], label='label 2')) 

mpld3.show() 
İlgili konular