2013-01-14 9 views
17

Stavo cercando di tracciare alcuni dati con dispersione. Il mio codice èImagine Matlock: dati ruotati?

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 
from scipy.interpolate import griddata 
data = np.loadtxt('file1.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 
plt.scatter(x, y, c=z, s=100, cmap=mpl.cm.spectral) 
cbar=plt.colorbar() 
s=18 
plt.ylabel(r"$a_v$", size=s) 
plt.xlabel(r"$a_{\rm min}$", size=s) 
plt.xlim([x.min(),x.max()]) 
plt.ylim([y.min(),y.max()]) 
plt.show() 

Il risultato è enter image description here

Ora mi è venuto l'idea di provare imshow con l'alcuni dati, soince non mi piaceva i cerchi di dispersione. Così ho provato questo

from matplotlib.mlab import griddata 
import matplotlib.pyplot as plt 
data = np.loadtxt('file1.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

N = 30j 
extent = (min(x), max(x), min(y), max(y)) 

xs,ys = np.mgrid[extent[0]:extent[1]:N, extent[2]:extent[3]:N] 

resampled = griddata(x, y, z, xs, ys) 

plt.imshow(resampled.T, extent=extent) 
s=18 
plt.ylabel(r"$a_v$", size=s) 
plt.xlabel(r"$a_{\rm min}$", size=s) 
plt.xlim([x.min(),x.max()]) 
plt.ylim([y.min(),y.max()]) 
cbar=plt.colorbar() 
plt.show() 

Con questo risultato: enter image description here

Il mio problema è il motivo per cui obviosly imshow() non invertire i dati? Cosa succede qui esattamente?

PS: Qui ci sono le data, nel caso in cui qualcuno vorrebbe giocare con loro

risposta

31

Vedere gli argomenti parola chiave di imshow. C'è origin. L'impostazione predefinita è "superiore", ma si desidera "abbassare".

L'impostazione predefinita ha senso per il tracciamento delle immagini, che di solito iniziano nell'angolo in alto a sinistra. Per la maggior parte dei plottaggi matriciali, è necessario origin="lower"

+0

mi ha salvato la vita e mi è costato ore di debug della mia "presumibilmente" falsa funzione – n3rd

4

Non è invertita, appena capovolto. L'origine di imshow è predefinita in alto a sinistra anziché in basso a sinistra. imshow ha un parametro per specificare l'origine, è il nome di origine. In alternativa puoi impostare il valore predefinito nel tuo matplotlib.conf.

+0

Cambiare il predefinito a livello globale sembra una cattiva idea nel caso in cui si desideri eseguire il codice di altre persone. – Mark

1

BTW, è possibile utilizzare marker = 's' per disegnare quadrati nel grafico a dispersione anziché in cerchi e mantenere solo il codice originale.

2

Si consiglia di utilizzare pcolormesh o contourf se si desidera stampare i dati del modulo f(X, Y) = Z. imshow stampa semplicemente i dati Z, il ridimensionamento e il ricampionamento devono essere eseguiti manualmente.

Problemi correlati