2010-12-15 41 views
10

J'ai un graphique avec quelques segments de ligne (LineCollection) et quelques points. Ces lignes et points ont des valeurs qui ne sont pas représentées. Je voudrais être en mesure d'ajouter une pointe d'outil de souris ou une autre méthode de trouver facilement la valeur associée pour les points et la ligne. Est-ce possible pour les segments de points ou de lignes?Info-bulles de point et de ligne dans matplotlib?

+2

[Voici un exemple de matplotlib] (http://matplotlib.sourceforge.net/ examples/pylab_examples/cursor_demo.html), que j'ai trouvé sur Google. [Alors voici une autre réponse SO populaire.] (Http://stackoverflow.com/a/4674445/1020470) [Eh bien, et celui-ci aussi, cela pointe également vers l'exemple matplotlib.] (Http://stackoverflow.com/ a/7909589/1020470) –

Répondre

6

Pour les points, j'ai trouvé un moyen, mais vous devez utiliser le back-end WX

"""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

Il serait extrêmement agréable si enthought supporté une fonctionnalité comme celle-ci pour les composants plus généralement ... – aestrivex

1

Peut-être une variante this recipe ferait ce que vous voulez pour les points? Au moins, il n'est pas limité à wx backend.

2

Il est un vieux fil, mais au cas où quelqu'un est à la recherche pour savoir comment ajouter des infobulles aux lignes, cela fonctionne:

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()