En una ventana de figura de matplotlib (con imshow), ¿cómo puedo eliminar, ocultar o redefinir la posición mostrada del mouse?

Estoy usando ipython con matplotlib, y muestro imágenes de esta manera:

(iniciado con: ipython –pylab)

figure() im = zeros([256,256]) #just a stand-in for my real images imshow(im) 

Ahora, cuando muevo el cursor sobre la imagen, veo la ubicación del mouse en la esquina inferior izquierda de la ventana de la figura. Los números mostrados son x = número de columna, y = número de fila. Esto es muy orientado a la ttwig más que a la imagen. ¿Puedo modificar los números mostrados?

  1. Mi primera opción sería mostrar x = número de fila * escalar, y = número de columna * escalar
  2. Mi segunda opción sería mostrar x = número de fila, y = número de columna
  3. Mi tercera opción es no mostrar los números de la ubicación del mouse en absoluto

¿Puedo hacer alguna de estas cosas? Ni siquiera estoy seguro de cómo llamar a ese pequeño widget de prueba de mouse-over. ¡Gracias!

Puede hacer esto simplemente por eje simplemente reasignando format_coord del objeto Axes , como se muestra en los ejemplos .

format_coord es cualquier función que toma 2 argumentos (x, y) y devuelve una cadena (que luego se muestra en la figura).

Si no quieres tener pantalla simplemente haz:

 ax.format_coord = lambda x, y: '' 

Si quieres solo la fila y la columna (sin marcar)

 scale_val = 1 ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), scale_val * int(y + .5)) 

Si desea hacer esto en cada imagen que realice, simplemente defina la función de envoltura

 def imshow(img, scale_val=1, ax=None, *args, **kwargs): if ax is None: ax = plt.gca() im = ax.imshow(img, *args, **kwargs) ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), scale_val * int(y + .5)) ax.figure.canvas.draw() return im 

lo que sin muchas pruebas creo que debería ser más o menos un reemplazo plt.imshow de plt.imshow

Sí tu puedes. Pero es más difícil de lo que piensas.

La etiqueta de seguimiento del mouse que ves es generada por las llamadas a matplotlib.axes.Axes.format_coord en respuesta al rastreo del mouse. Debe crear su propia clase de Ejes (anulando format_coord para hacer lo que quiere que haga), luego indique a matplotlib que la use en lugar de la predeterminada.

Específicamente:

Haz tu propia subclase de ejes

 from matplotlib.axes import Axes class MyRectilinearAxes(Axes): name = 'MyRectilinearAxes' def format_coord(self, x, y): # Massage your data here -- good place for scalar multiplication if x is None: xs = '???' else: xs = self.format_xdata(x * .5) if y is None: ys = '???' else: ys = self.format_ydata(y * .5) # Format your label here -- I transposed x and y labels return 'x=%sy=%s' % (ys, xs) 

Registra tu subclase de ejes

 from matplotlib.projections import projection_registry projection_registry.register(MyRectilinearAxes) 

Crea una figura y con tus ejes personalizados.

 figure() subplot(111, projection="MyRectilinearAxes") 

Dibuja tus datos como antes

 im = zeros([256,256]) #just a stand-in for my real images imshow(im)