Generare mappe di calore in python
-
28-10-2019 - |
Domanda
Voglio produrre un'immagine di mappa di calore simile a quella in questo Rispondere. La differenza è che voglio farlo da un array 2D di valori tra 0 e 1.
Quello che ho provato:
def generate_x_y_vectors(prob_map):
multiplier = 100
xs = []
ys = []
for y in range(len(prob_map)):
for x in range(len(prob_map[y])):
count = int(prob_map[y][x] * multiplier)
xs.extend([x] * count)
ys.extend([y] * count)
return (xs, ys)
def heatmap(probabilities):
#probabilities is a 2d nxn array
n = len(probability_map)
gridsize = n + 1
(xs, ys) = generate_x_y_vectors(probability_map)
plt.figure()
plt.hexbin(xs, ys, C=None, gridsize=gridsize, mincnt=1)
plt.axis([0, n, 0, n])
Il problema principale con questo è che non riesco a sintonizzare la griglia per creare una mappa ordinata: un sacco di spazio bianco finisce per fare un effetto a strisce /ecc.
In entrambi i casi, immagino che ci sia un modo molto migliore di farlo, senza dover passare attraverso la noiosa generazione di punti!
Idealmente vorrei che un meccanismo fosse soglia se trama un esagono o meno (come ho fatto sopra).
La mia motivazione è che ho una semplice catena di markov a 2 variabili, in cui la somma delle 2 variabili non può superare un certo valore, n. Ho un array con qualche probabilità per ogni condizione iniziale. Quindi la mappa di calore sarebbe un triangolo racchiuso dall'area x <ny.
Soluzione
Non sono davvero sicuro di cosa vuoi fare con il tuo codice. L'ho letto come:
"Visualizza un'immagine 2D tramite hexbin".
La parte "Soglie di mostrare una parte esagono o no" sembra il parametro MINCNT in Hexbin. ("Se non nessuno, mostra solo celle con più del numero MINCNT di punti nella cella"). Per cose più complicate, dovresti generare matrici mascherate da X, Y, C.
È questo quello che vuoi fare? In tal caso, il codice seguente dovrebbe darti un punto di partenza:
import numpy as np
import matplotlib.pyplot as plt
def generate_x_y(prob_map):
s = prob_map.shape
x, y = np.meshgrid(np.arange(s[0]), np.arange(s[1]))
return x.ravel(), y.ravel()
def heatmap(prob_map):
x, y = generate_x_y(prob_map)
plt.figure()
plt.hexbin(x, y, C=prob_map.ravel())
probs = np.random.rand(200, 200)
heatmap(probs)
plt.show()
La differenza per le tue funzioni con l'ulteriore:
probs = np.random.rand(200, 200)
heatmap(probs)
plt.show()
può essere visto in queste figure: dal tuo codice (comprese le strisce):
dal mio codice (solo casuale come dovrebbe essere):
Altri suggerimenti
Uno strumento completo della linea di comando che genera mappa di calore dal video CCTV di un luogo particolare.