2009-07-17 52 views
20

Estoy visualizando una imagen jpg (giro esto 90 grados, si esto es relevante) y por supuesto los ejes muestran las coordenadas de píxeles. Me gustaría convertir el eje para que en lugar de mostrar el número de píxel, muestre mi unidad de elección, ya sea radianes, grados o en mi caso una coordenada astronómica. Sé la conversión de pixel a (por ejemplo) grado. Aquí hay un fragmento de lo que mi código es el momento:¿Cómo convierto (o escala) valores de eje y redefino la frecuencia de ticks en matplotlib?

import matplotlib.pyplot as plt 
import Image 
import matplotlib 
thumb = Image.open(self.image) 
thumb = thumb.rotate(90) 
dpi = plt.rcParams['figure.dpi'] 
figsize = thumb.size[0]/dpi, thumb.size[1]/dpi 
fig = plt.figure(figsize=figsize) 
plt.imshow(thumb, origin='lower',aspect='equal') 
plt.show() 

... así que a raíz de esto, puedo tomar cada valor que matplotlib imprimiría en el eje, y el cambio/sustituirla por una cadena de salida en su lugar? Me gustaría hacer esto para un formato de coordenadas específico - por ejemplo, en lugar de un ángulo de 10.44 (grados), me gustaría leer 10 26 '24' '(es decir, grados, arcmins, arcsecs)

Finalmente sobre este tema, me gustaría tener control sobre la frecuencia de ticks, en la trama. Matplotlib podría imprimir el valor del eje cada 50 píxeles, pero realmente lo quisiera cada grado (por ejemplo).

Parece que quisiera definir algún tipo de matriz con los valores de píxel y sus valores convertidos (grados, etc.) que quiero que se muestren, teniendo control sobre la frecuencia de muestreo en el rango xmin/xmax.

¿Hay algún experto de matplotlib en Stack Overflow? Si es así, ¡muchas gracias de antemano por su ayuda! Para hacer de esto una experiencia de aprendizaje más, realmente agradecería que me guiaran por tutoriales, etc. sobre este tipo de problema matplotlib. ¡Me he confundido mucho con hachas, ejes, figuras, artistas, etc.!

Saludos,

de Dave

Respuesta

31

Parece que usted está tratando con la interfaz matplotlib.pyplot, lo que significa que usted será capaz de pasar por alto la mayor parte del trato con los artistas, hachas, y similares. Puede controlar los valores y las etiquetas de las marcas de la señal utilizando el comando matplotlib.pyplot.xticks, de la siguiente manera:

tick_locs = [list of locations where you want your tick marks placed] 
tick_lbls = [list of corresponding labels for each of the tick marks] 
plt.xticks(tick_locs, tick_lbls) 

Para su ejemplo particular, tendrá que calcular lo que las marcas de graduación son en relación con las unidades (es decir píxeles) de su trama original (ya que está usando imshow) - dijo que sabía cómo hacer esto.

No he tratado con imágenes mucho, pero usted puede ser capaz de utilizar un método de trazado diferente (por ejemplo pcolor) que le permite proporcionar x y y información. Eso puede darte algunas opciones más para especificar las unidades de tu imagen.

Para obtener tutoriales, debería consultar el matplotlib gallery - encuentre algo que desee y lea el código que lo produjo. Uno de los chicos de nuestra oficina compró recientemente un libro en Python visualization, que puede valer la pena mirar.

La forma en que generalmente pienso en todas las diferentes piezas es el siguiente:

  • Un Figure es un contenedor para todo el Axes
  • Un Axes es el espacio donde lo que se dibuja (es decir,su parcela) muestra realmente para arriba
  • Un Axis es el actual x y y ejes
  • artistas? Para mí, eso es demasiado profundo en la interfaz: nunca tuve que preocuparme por ellos, aunque rara vez uso el módulo pyplot en los gráficos de producción.
+0

Gracias, esto funciona magníficamente. Sin embargo, un comentario más. Cuando uso plt.xticks, ya no obtengo la posición x, y (esperaría esto como píxeles en ningún aspecto) del mouse cuando se muestra el gráfico. ¿Alguna idea de por qué esto sería? – Dave

+0

Eso * es * extraño - Nunca me había dado cuenta de esto antes. No sé lo suficiente sobre esa ventana GUI para hacer una recomendación, podría ser una buena pregunta aquí o en la lista de correo matplotlib. –

+0

Una mejor solución para convertir coordenadas es usar la palabra clave 'extent' cuando se usa imshow. – Phlya

Cuestiones relacionadas