Создание тепловых карт в Python - PullRequest
1 голос
/ 10 сентября 2011

Я хочу создать тепловую карту, аналогичную той, которая приведена в этом ответе .Разница в том, что я хочу сделать это из двумерного массива значений от 0 до 1.

Что я пробовал:

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

Основная проблема в том, что я не могу настроитьразмер сетки, чтобы сделать аккуратную карту - много пустого пространства в конечном итоге создает полосатый эффект /etc.

В любом случае, я бы вообразил, что есть гораздо лучший способ сделать это, не проходя через утомительныйгенерация точек!

В идеале я бы хотел, чтобы какой-то механизм порогового значения определял, строить ли шестиугольник или нет (как я уже делал выше).

Моя мотивация - у меня есть простая 2 переменная Марковацепочка, в которой сумма двух переменных не может превышать некоторого значения, n.У меня есть массив с некоторой вероятностью для каждого начального условия.Таким образом, карта тепла будет треугольником, охватываемым областью x

Ответы [ 2 ]

3 голосов
/ 11 сентября 2011

Я не совсем уверен, что вы хотите делать со своим кодом.Я прочитал это как:

"Показать 2d изображение через hexbin".

Элемент «Определение порога для отображения шестиугольника или нет» выглядит как параметр mincnt в hexbin.(«Если нет, отображать только ячейки с числом точек в ячейке больше, чем mincnt»).Для более сложных вещей вы должны генерировать маскированные массивы из x, y, C.

Это то, что вы хотите сделать?Если это так, приведенный ниже код должен дать вам отправную точку:

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

Различие ваших функций с дополнительным:

probs = np.random.rand(200, 200)
heatmap(probs)
plt.show()

можно увидеть на следующих рисунках: из вашего кода(включая полосы):

enter image description here

из моего кода (просто случайный, как и должно быть):

enter image description here

0 голосов
/ 08 января 2019

A Полный инструмент создания тепловой карты для командной строки из видеонаблюдения Видео определенного места.

https://github.com/ajayrawat12/generate_heatmap

...