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.

È stato utile?

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

enter image description here

dal mio codice (solo casuale come dovrebbe essere):

enter image description here

Altri suggerimenti

Uno strumento completo della linea di comando che genera mappa di calore dal video CCTV di un luogo particolare.

https://github.com/ajayrawat12/generate_heatmap

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top