2012-07-06 23 views
6

Estoy aprendiendo Python y esta es mi primera pregunta aquí. He leído otros temas relacionados con el uso de imshow pero no encontré nada útil. Perdón por mi mal ingles.imshow e histogram2d: no puedo hacer que funcionen

he trazado un conjunto de puntos aquí, gráfico izquierdo:

points (left) and image (right)

Ahora me gustaría ver una imagen de la densidad de puntos, por lo que se utiliza imshow y histogram2d , y obtuve la imagen a la derecha en el enlace anterior.

La imagen no corresponde a la distribución de los puntos. ¿Cómo es esto posible? He seguido las instrucciones de la ayuda e incluso cambiado algunos parámetros, pero nada funcionó :(

El código es:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

j, h, k = np.loadtxt("test.dat", usecols=(2, 4, 6), \ 
    unpack=True) 

# límites 
xmin = -0.5 
xmax = 3.0 
ymin = -0.5 
ymax = 4.0 

# colores 
j_h = j - h 
h_k = h - k 

# no todas las estrellas son graficadas  
x1 = 0.5 
y1 = 0.5 
b = 2.2 
c = y1 - b * x1 

x = y = np.array([]) 

for xi, yi in zip(h_k, j_h): 
    if xi < (yi - c)/b: 
     x = np.append(x, xi) 
     y = np.append(y, yi) 

# gráfico 
fig = plt.figure(figsize=(8, 7)) 

ax = fig.add_subplot(111) 
#ax.plot(x, y, "go") 
ax.set_xlabel(r"X", fontsize=14) 
ax.set_ylabel(r"Y", fontsize=14) 
ax.axis([xmin, xmax, ymin, ymax]) 

# imagen 
rango = [[xmin, xmax], [ymin, ymax]] 
binsx = int((xmax - xmin)/0.05) 
binsy = int((ymax - ymin)/0.05) 
binsxy = [binsx, binsy] 

H, xedges, yedges = np.histogram2d(x, y, range=rango, bins=binsxy) 

extent = [yedges[0], yedges[-1], xedges[0], xedges[-1]] 
cp = ax.imshow(H, interpolation='bilinear', extent=extent, cmap=cm.jet) 
fig.colorbar(cp) 

plt.show() 

Los enlaces para los datos utilizados es aquí:

https://dl.dropbox.com/u/10411539/python/test.dat

¡Se agradece cualquier ayuda!

+2

especificar 'origen = 'lower'' para la función imshow – gcalmettes

+0

@gcalmettes: Esto no funcionó :( – skytux

+0

Ahora funcionó, pero el establecimiento de H.transpose() Gracias !!. – skytux

Respuesta

5

Pruebe la interpolación diferente, y transponga la matriz para obtenerlo en el mismo eje:

cp = ax.imshow(H.transpose()[::-1], interpolation='nearest', extent=extent, cmap=cm.jet) 
+0

Esto no funciona, pero gracias @urinieto – skytux

+0

@skytux tienes razón, los ejes fueron intercambiados. Acabo de actualizar mi respuesta. Gracias por avisarme. –

+0

Esto funcionó bien con la matriz transpuesta y ... ([:: -1]) ¿qué es esto? Pero utilicé la extensión como DiggyF dijo antes, porque en mi caso fue invertido. Muchas gracias! – skytux

4

¿Es esto lo que desea obtener? Puede usar pcolor (y pcolormesh) si desea pasar las coordenadas xey.

import urllib 
import numpy as np 
import matplotlib.pyplot as plt 
f = urllib.urlopen('https://dl.dropbox.com/u/10411539/python/test.dat') 
j, h, k = np.loadtxt(f, usecols=(2, 4, 6), \ 
    unpack=True) 
j, h, k 
j_h = j - h 
h_k = h - k 
H, xedges, yedges = np.histogram2d(j_h, h_k, bins=100) 
plt.pcolor(xedges, yedges, H) 

Example of pcolor using histogram2d

Para imshow usted tiene que invertir la primera dimensión, porque imshow utiliza fila de base cero, los índices de columna a la x, y. Dibujando de arriba hacia abajo.

plt.imshow(H[::-1,:], extent=(0,5, 0,2.5)) # typed in extent by hand. 

imshow example

+0

Gracias por su respuesta! En el primer caso (pcolor) primero se usa j_h (eje x) y luego h_k (eje y). ¿Es eso correcto? ... porque mi argumento es el opuesto. ¿También los contenedores deben ser iguales en las direcciones xey? En el segundo caso (imshow), la imagen de densidad no sigue la dirección de los puntos si los traza juntos ... – skytux

+0

Imshow supone coordenadas equidistantes xey. Pcolor también funciona para coordenadas no equidistantes y no rectilíneas. Pensé en dejar fuera algunos de los cálculos x, y como un ejemplo más simple.Lo principal es que imshow, por defecto, tiene el origen en la parte superior. La opción de origen = inferior, sugerida por los gcalmettes, es más elegante. – SiggyF

+0

De hecho, usando origen = menor trabajado, pero solo con H.transpose() !! – skytux

Cuestiones relacionadas