2011-10-05 27 views
15

Tengo un diagrama de dispersión con varios miles de puntos. Este post me dice cómo etiquetar ellos:Matplotlib: puntos de etiqueta en mouseover

Matplotlib: How to put individual tags for a scatter plot

Pero eso se verá como un desastre con tantos puntos. Lo que me gustaría, en cambio, es tener una etiqueta de tipo "punta de herramienta" que aparece cuando mueves el cursor sobre un punto. ¿Es posible usar matplotlib?

+5

Puede usar [DataCursor] de Joe Kington (http://stackoverflow.com/questions/4652439/is-there-a-matplotlib-equivalent-of-matlabs-datacursormode/4674445#4674445) para mostrar una información emergente sobre herramientas cada vez que lo haga. haces clic en un punto – unutbu

Respuesta

6

Una vez que obtenga las coordenadas del punto, puede mostrarlas o cualquier información vinculada a un objeto en un textctrl en la barra de herramientas. Para esto, debe crear una instancia de una barra de herramientas (NavigationToolbar2Wx()) en su lienzo y agregar allí el control de texto. Esto no es tan bueno como una ventana emergente, pero cumple su función.

Aquí tienes un ejemplo de personalización de la barra de herramientas (sólo muestra la coordenada x en el txtctrl):

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
# 
""" 
jvisor_spectrum_panel (visor_07) 
25 julio 2010 
""" 
# 
import wx 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 
from matplotlib.backends.backend_wx import NavigationToolbar2Wx 
# 
# 
class SpectrumPanel(wx.Panel): 
    def __init__(self, parent, xlabel='m/z', ylabel='Intensity'): 
     wx.Panel.__init__(self, parent) 
     # 
     self.parent = parent 
     self.xlabel = xlabel 
     self.ylabel = ylabel 
     self.SetBackgroundColour("white") 
     # 
     self.figure = Figure() 
     self.canvas = FigureCanvas(self, -1, self.figure) 
     # 
     self.add_toolbar() 
     # 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP| wx.GROW| wx.EXPAND) 
     sizer.Add(self.toolbar, 0, wx.LEFT) 
     self.canvas.mpl_connect('motion_notify_event', self.on_motion) 
     self.SetSizer(sizer) 
     self.Fit() 
     self.clean() 
    # 
    def add_toolbar(self): 
     "" 
     self.toolbar = NavigationToolbar2Wx(self.canvas) 

     mass_txt = wx.StaticText(self.toolbar, label='m/z', pos=(230, 7), 
                  size=(25, 17)) 
     mass_txt.SetBackgroundColour("light gray") 
     self.mass = wx.TextCtrl(self.toolbar, pos=(260,4), size=(50, 22), 
                  style=wx.TE_READONLY) 
     # 
     self.toolbar.SetToolBitmapSize(wx.Size(24, 25)) 
     self.toolbar.SetMinSize((1500, 31)) 
     self.toolbar.Realize() 
     self.toolbar.Update() 
    # 
    def clean(self): 
     "" 
     self.figure.clear() 
     self.axes = self.figure.add_subplot(111) 
    # 
    def dibuja(self): 
     "dibuja el canvas" 
     self.axes.set_xlabel(self.xlabel) 
     self.axes.set_ylabel(self.ylabel) 
     self.canvas.draw() 
    # 
    def on_motion(self, evt): 
     if evt.inaxes: 
      xpos = evt.xdata 
      self.mass.SetValue(' %0.1f' % (xpos)) 


if __name__ == '__main__': 
    "" 
    class TestFrame(wx.Frame): 
     def __init__(self, *args, **kargs): 
      wx.Frame.__init__(self, *args, **kargs) 
      self.panel = SpectrumPanel(self) 
      self.Fit() 
    #   
    app = wx.PySimpleApp() 
    fr = TestFrame(None) 
    fr.Show() 
    app.MainLoop() 

Y aquí se puede ver el nuevo control en la barra de herramientas:

enter image description here

+0

Agradecería si pudieras echarle un vistazo a esta pregunta relacionada con 'matplotlib'. https://stackoverflow.com/questions/45398699/python-how-to-plot-the-predictor-and-predicted-value-in-the-same-graph – Mahsolid

Cuestiones relacionadas