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?
10
A
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()
[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) –