2012-07-06 13 views
6

Sto imparando Python e questa è la mia prima domanda qui. Ho letto altri argomenti relativi all'uso di imshow ma non ho trovato nulla di utile. Scusa per il mio cattivo inglese.imshow e histogram2d: non riesco a farli funzionare

ho tracciato una serie di punti qui, grafico a sinistra:

points (left) and image (right)

Ora mi piacerebbe vedere un'immagine della densità dei punti, così ho usato imshow e histogram2d e ho ottenuto l'immagine a destra nel link precedente.

L'immagine non corrisponde alla distribuzione dei punti. Com'è possibile? Ho seguito le istruzioni nella guida e anche cambiato alcuni parametri, ma niente ha funzionato :(

Il codice è:

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() 

I collegamenti dei dati utilizzati è qui:

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

Qualsiasi aiuto è gradito!

+2

specificare 'origine = 'lower'' per la funzione imshow – gcalmettes

+0

@gcalmettes: Questo non ha funzionato :( – skytux

+0

Ora ha funzionato, ma l'impostazione H.transpose() Grazie !!. – skytux

risposta

5

Provare diversa interpolazione e trasporre la matrice per ottenerla sullo stesso asse:

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

Questo non funziona ma grazie @urinieto – skytux

+0

@skytux hai ragione, gli assi sono stati scambiati Ho appena aggiornato la mia risposta Grazie per avermelo detto –

+0

Questo ha funzionato bene con la matrice trasposta e ... ([:: -1]) che cosa è questo ?? Ma ho usato la misura come DiggyF detto prima perché nel mio caso era invertito. Grazie mille !! – skytux

4

È questo che vuoi ottenere? Puoi usare pcolor (e pcolormesh) se vuoi passare le coordinate 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

Per imshow si deve invertire la prima dimensione, perché imshow utilizza riga base zero, indici colonna alla x, y. Disegno dall'alto verso il basso.

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

imshow example

+0

Grazie per la tua risposta! Nel primo caso (pcolor) si usa prima j_h (asse x) e poi h_k (asse y). È corretto? ... perché la mia trama è l'opposto. Anche i contenitori devono essere uguali nelle direzioni xe y? Nel secondo caso (imshow) l'immagine di densità non segue la direzione dei punti se li si traccia insieme ... – skytux

+0

Imshow assume coordinate xey equidistanti. Pcolor funziona anche con coordinate non equidistanti e non rettilinee. Ho pensato di escludere parte del calcolo x, y come un esempio più semplice.La cosa principale è che imshow, per impostazione predefinita, ha l'origine in alto. L'opzione di origine = inferiore, suggerita da gcalmettes, è più elegante. – SiggyF

+0

Effettivamente utilizzando l'origine = inferiore ha funzionato, ma solo con H.transpose() !! – skytux

Problemi correlati