2014-11-26 31 views
12

Sono nuovo in Python.Python: creazione di un istogramma 2D da una matrice numpy

Ho una matrice numpy, di dimensioni 42x42, con valori nell'intervallo 0-996. Voglio creare un istogramma 2D usando questi dati. Ho esaminato i tutorial, ma sembrano tutti mostrare come creare istogrammi 2D da dati casuali e non da una matrice numpy.

Finora, Ho importato:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import colors 

non sono sicuro se queste sono le importazioni corrette, sto solo cercando di raccogliere quello che posso da tutorial che vedo.

Ho la matrice numpy M con tutti i valori in essa contenuti (come descritto sopra). Alla fine, voglio farlo sembrare qualcosa di simile:

2D histogram

ovviamente, i miei dati sarà diversa, quindi il mio trama dovrebbe avere un aspetto diverso. Qualcuno può darmi una mano?

Edit: Per i miei scopi, Hooked esempio s' al di sotto, utilizzando matshow, è esattamente quello che sto cercando.

+0

qual è la sua xey nella matrice NumPy, è fondamentalmente 42 righe e 42 colonne. quali sono i tuoi valori x, y? –

+0

Sì, la mia matrice è di 42 righe e 42 colonne. In ogni indice, c'è un numero intero compreso tra 0 e 99 che è stato calcolato e collocato in precedenza nel programma. – Kestrel

risposta

19

Se si dispone dei dati grezzi dai Conti, è possibile utilizzare plt.hexbin per creare le trame per voi (IMHO questo è meglio di un reticolo quadrato): Adattato da l'esempio di hexbin:

import numpy as np 
import matplotlib.pyplot as plt 

n = 100000 
x = np.random.standard_normal(n) 
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n) 
plt.hexbin(x,y) 

plt.show() 

enter image description here

Se hai già i valori z in una matrice come si parla, basta usare plt.imshow o plt.matshow:

XB = np.linspace(-1,1,20) 
YB = np.linspace(-1,1,20) 
X,Y = np.meshgrid(XB,YB) 
Z = np.exp(-(X**2+Y**2)) 
plt.imshow(Z,interpolation='none') 

enter image description here

+0

'matshow' è esattamente quello che sto cercando. Grazie mille! – Kestrel

11

Se si dispone non solo la matrice istogramma 2D ma anche il sottostante dati (x, y), allora si potrebbe fare una rappresentazione della dispersione dei (x, y) punti e colorare ciascun punto in base al suo valore di conteggio in bin nella matrice 2D-istogramma :

import numpy as np 
import matplotlib.pyplot as plt 

n = 10000 
x = np.random.standard_normal(n) 
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n) 
xedges, yedges = np.linspace(-4, 4, 42), np.linspace(-25, 25, 42) 
hist, xedges, yedges = np.histogram2d(x, y, (xedges, yedges)) 
xidx = np.clip(np.digitize(x, xedges), 0, hist.shape[0]-1) 
yidx = np.clip(np.digitize(y, yedges), 0, hist.shape[1]-1) 
c = hist[xidx, yidx] 
plt.scatter(x, y, c=c) 

plt.show() 

Example scatter plot of 2D histogram

1

@unutbu's answer contiene un errore: 012.336.789,284 milae yidx sono calcolati nel modo sbagliato (almeno sul mio campione di dati). Il modo corretto dovrebbe essere:

xidx = np.clip(np.digitize(x, xedges) - 1, 0, hist.shape[0] - 1) 
yidx = np.clip(np.digitize(y, yedges) - 1, 0, hist.shape[1] - 1) 

Poiché la dimensione ritorno di np.digitize che ci interessa è tra 1 e len(xedges) - 1, ma le esigenze indici c = hist[xidx, yidx] tra 0 e hist.shape - 1.


Di seguito è riportato il confronto dei risultati. Come puoi vedere ottieni risultati simili ma non uguali.

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 

n = 10000 
x = np.random.standard_normal(n) 
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n) 
xedges, yedges = np.linspace(-4, 4, 42), np.linspace(-25, 25, 42) 
hist, xedges, yedges = np.histogram2d(x, y, (xedges, yedges)) 

xidx = np.clip(np.digitize(x, xedges), 0, hist.shape[0] - 1) 
yidx = np.clip(np.digitize(y, yedges), 0, hist.shape[1] - 1) 
c = hist[xidx, yidx] 
old = ax1.scatter(x, y, c=c, cmap='jet') 

xidx = np.clip(np.digitize(x, xedges) - 1, 0, hist.shape[0] - 1) 
yidx = np.clip(np.digitize(y, yedges) - 1, 0, hist.shape[1] - 1) 

c = hist[xidx, yidx] 
new = ax2.scatter(x, y, c=c, cmap='jet') 


plt.show() 

Same Same but Different

+0

Quando si invia una risposta, assicurarsi che la risposta non contenga informazioni fornite in altre risposte. Hai correttamente descritto il problema in un'altra risposta (che è una buona cosa da fare) ma poi ** ha fornito solo una soluzione parziale ** che non può essere utilizzata senza guardare l'altra risposta. Per favore ** modifica ** la tua risposta e includi uno snippet completo o il tuo post verrà probabilmente eliminato. –

Problemi correlati