2011-04-29 31 views
8

Me gustaría saber el valor de color de un punto donde hago clic cuando uso imshow() en matplotlib. ¿Hay alguna manera de encontrar esta información a través del controlador de eventos en matplotlib (de la misma manera que están disponibles las coordenadas x, y de su clic)? Si no, ¿cómo encontraría esta información?¿Valores de color en imshow para matplotlib?

En concreto estoy pensando en un caso como este:

imshow(np.random.rand(10,10)*255, interpolation='nearest') 

Gracias! --Erin

Respuesta

10

Aquí hay una solución aceptable. Solo funciona para interpolation = 'nearest'. Todavía estoy en busca de una forma más limpia para recuperar el valor interpolado de la imagen (en lugar de redondear los escogidos x, y, y la selección de la matriz original.) De todos modos:

from matplotlib import pyplot as plt 
import numpy as np 

im = plt.imshow(np.random.rand(10,10)*255, interpolation='nearest') 
fig = plt.gcf() 
ax = plt.gca() 

class EventHandler: 
    def __init__(self): 
     fig.canvas.mpl_connect('button_press_event', self.onpress) 

    def onpress(self, event): 
     if event.inaxes!=ax: 
      return 
     xi, yi = (int(round(n)) for n in (event.xdata, event.ydata)) 
     value = im.get_array()[xi,yi] 
     color = im.cmap(im.norm(value)) 
     print xi,yi,value,color 

handler = EventHandler() 

plt.show() 
+1

Gracias, Paul! Esto es exactamente lo que estaba buscando. He agregado un par de líneas extraídas de esta pregunta: http://stackoverflow.com/questions/214359/converting-hex-to-rgb-and-vice-versa#214657 y ahora también puedo imprimir los valores hexadecimales RGB:) –

1

La solución anterior sólo funciona para una sola imagen. Si traza dos o más imágenes en la misma secuencia de comandos, el evento "inaxes" no hará una diferencia entre ambos ejes. Nunca sabrá en qué eje está haciendo clic, por lo que no sabrá qué valor de imagen debe mostrarse.

1

Si con 'valor de color' se entiende el valor de la matriz en un punto en el que se hace clic en un gráfico, esto es útil.

from matplotlib import pyplot as plt 
import numpy as np 


class collect_points(): 
    omega = [] 
    def __init__(self,array): 
     self.array = array 
    def onclick(self,event): 
     self.omega.append((int(round(event.ydata)), int(round(event.xdata)))) 

    def indices(self): 
     plot = plt.imshow(self.array, cmap = plt.cm.hot, interpolation = 'nearest', origin= 'upper') 
     fig = plt.gcf() 
     ax = plt.gca() 
     zeta = fig.canvas.mpl_connect('button_press_event', self.onclick) 
     plt.colorbar() 
     plt.show() 
     return self.omega 

uso sería algo así como:

from collect_points import collect_points 
import numpy as np 

array = np.random.rand(10,10)*255 
indices = collect_points(array).indices() 

debe aparecer una ventana de trazado, se hace clic en puntos, y devueltos son los índices de la matriz numpy.

0

Se podría intentar algo como el siguiente:

x, y = len(df.columns.values), len(df.index.values) 

# subplot etc 

# Set values for x/y ticks/labels 
ax.set_xticks(np.linspace(0, x-1, x)) 
ax.set_xticklabels(ranges_df.columns) 
ax.set_yticks(np.linspace(0, y-1, y)) 
ax.set_yticklabels(ranges_df.index) 

for i, j in product(range(y), range(x)): 
    ax.text(j, i, '{0:.0f}'.format(ranges_df.iloc[i, j]), 
    size='small', ha='center', va='center') 
+0

Buen grito, gracias Andras – cardycakes

Cuestiones relacionadas