2011-09-10 144 views
1

我想生成一個類似於answer中的熱圖圖像。不同的是,我想從值0和1在Python中生成熱圖

之間的二維數組我試圖做到這一點:

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

與此的主要問題是,我不能調gridsize作整潔的地圖 - 大量的白色空間最終形成條紋效果/等等。

在任何一種情況下,我都會想像有一種更好的方式來做到這一點,而不必經歷乏味的生成點!

理想情況下,我想要一些機制來決定是否繪製一個六邊形或不(如我上面所做的)。

我的動機是我有一個簡單的2變量馬爾可夫鏈,其中2個變量的總和不能超過某個值,n。每個初始條件我都有一個概率數組。所以熱圖將是一個由區域x < n-y所包圍的三角形。

+0

這是一個相當複雜的問題,並沒有說明你到目前爲止嘗試過的任何東西。你知道Python嗎?你只是在尋找某人爲你寫代碼嗎?請更多細節,特別是你嘗試過的。只是在正確的方向提示,看看matplotlib。 – Vorticity

+0

感謝您的澄清。它看起來像hexbin是你在找什麼,所以你在正確的軌道上。你如何獲得網格?當你說條紋效果你是指橫條紋? – Vorticity

回答

3

我不太清楚你想用你的代碼做什麼。 我讀過它:

「通過hexbin顯示2d圖像」。

「顯示六角形或不顯示六邊形的閾值」部分看起來像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

太棒了!仔細檢查C參數的文檔會有幫助嗎? :)我認爲你的q作爲「通過hexbin繪製二維圖像」的框架幫助我看到了這一點。謝謝! – neuronotic

+0

歡迎您。很高興我能幫上忙。 :-) – xubuntix