2013-01-14 102 views
0

我有一個製表符分隔的文件,其中包含區域和在這些區域中找到的相應生物實體(我檢查了67個,因此您說每個區域都檢查了這67個實體及其實體的存在與否頻率)。巨大數據集的熱圖

我擁有表格格式的所有數據。 (取決於頻率和在不存在的情況下,白色)

的採樣數據如下

Region ATF3 BCL3 BCLAF1 BDP1 BRF1 BRF2 Brg1 CCNT2 CEBPB CHD2 CTCF CTCFL E2F6 ELF1 
chr1:109102470:109102970 0 0 1 0 0 0 0 1 0 0 4 1 4 1 
chr1:110526886:110527386 0 0 0 0 0 0 0 1 1 0 4 1 0 1 
chr1:115300671:115301171 0 0 1 0 0 0 0 0 1 1 4 1 1 1 
chr1:115323308:115323808 0 0 0 0 0 0 0 1 0 0 2 1 1 0 
chr1:11795641:11796141 1 0 0 0 0 0 0 1 2 0 0 0 1 0 
chr1:118148103:118148603 0 0 0 0 0 0 0 1 0 0 0 0 0 1 
chr1:150521397:150521897 0 0 0 0 0 0 0 2 2 0 6 2 4 0 
chr1:150601609:150602109 0 0 0 0 0 0 0 0 3 2 0 0 1 0 
chr1:150602098:150602598 0 0 0 0 0 0 0 0 1 1 0 0 0 0 
chr1:151119140:151119640 0 0 0 0 0 0 0 1 0 0 0 0 1 0 
chr1:151128604:151129104 0 0 0 0 0 0 0 0 0 0 3 0 0 0 
chr1:153517729:153518229 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
chr1:153962738:153963238 0 0 0 0 0 0 0 1 1 0 0 0 0 1 
chr1:154155682:154156182 0 0 0 0 0 0 0 1 0 0 0 0 1 1 
chr1:154155725:154156225 0 0 0 0 0 0 0 1 0 0 0 0 1 1 
chr1:154192154:154192654 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
chr1:154192824:154193324 1 0 0 0 0 0 0 1 0 1 0 0 1 1 
chr1:154192943:154193443 1 0 0 0 0 0 0 1 0 2 0 0 1 1 
chr1:154193273:154193773 1 0 0 0 0 0 0 1 0 2 0 0 2 1 
chr1:154193313:154193813 0 0 0 0 0 0 0 1 0 2 0 0 2 1 
chr1:155904188:155904688 0 0 0 0 0 0 0 1 0 0 0 0 1 1 
chr1:155947966:155948466 0 0 0 0 0 0 0 1 0 0 3 0 0 1 
chr1:155948336:155948836 0 0 0 0 0 0 0 1 0 0 5 1 0 1 
chr1:156023516:156024016 0 0 0 0 0 0 0 1 0 1 4 1 1 1 
chr1:156024016:156024516 0 1 1 0 0 0 0 0 0 2 0 0 1 1 
chr1:156163229:156163729 0 0 0 0 0 0 0 0 0 0 2 0 0 1 
chr1:160990902:160991402 0 0 0 0 0 0 0 0 0 1 0 0 1 2 
chr1:160991133:160991633 0 0 0 0 0 0 0 0 0 1 0 0 1 2 
chr1:161474704:161475204 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
chr1:161509530:161510030 0 0 1 1 1 0 0 0 1 0 1 0 0 1 
chr1:161590964:161591464 0 0 0 1 1 0 0 0 0 0 0 0 0 0 
chr1:169075446:169075946 0 0 0 0 0 0 0 2 0 0 4 0 3 0 
chr1:17053279:17053779 0 0 0 1 0 0 0 0 0 1 0 0 0 0 
chr1:1709909:1710409 0 0 0 0 0 0 0 2 0 1 0 0 3 1 
chr1:1710297:1710797 0 0 0 0 0 0 0 0 0 1 6 0 1 1 

現在我怎樣才能把這種在熱圖從顏色代碼淺紅色至暗紅色給出?

有沒有其他更好的方法來表示這種類型的數據?

+1

除了你的數據,你可以顯示[你試過](http://mattgemmell.com/2008/12/08/what-have-you-tried/)? –

+0

嗯,這個問答網站的實際編程。我不認爲圖表中有專家。 – Denis

+0

你是什麼意思巨大?許多行或列?如果其中一個數字接近您創建劇情的像素數量,這將不是一個好方法。 –

回答

4

使用Matplotlib

import pylab as plt 
import numpy as np 

data = np.loadtxt("14318737.txt", skiprows=1, converters={0:lambda x: 0}) 
plot_data = np.ma.masked_equal(data[:,1:], 0) 

plt.imshow(plot_data, cmap=plt.cm.get_cmap("Reds"), interpolation="nearest") 
plt.colorbar() 

plt.show() 

我忽略了第一行和第一列(如果你需要他們的標籤,我們需要改變這一點)。對於其餘數據,所有零值都被屏蔽(因此它們在圖中顯示爲白色),然後將這些數據繪製爲顏色編碼圖。

imshow有一堆其他參數來控制結果,例如,原點(下/上),方面(自動/相等/ some_ratio)。

你寫的地區 - 你的意思是地理區域?那麼你可能想看看Basemap Toolkit for Matplotlib來創建顏色編碼的地圖。

編輯

的新要求,新的例子

import pylab as plt 
import numpy as np 

fn = "14318737.txt" 
with open(fn, "r") as f: 
    labels = f.readline().rstrip("\n").split()[1:] 
data = np.loadtxt(fn, skiprows=1, converters={0:lambda x: 0}) 
plot_data = np.ma.masked_equal(data[:,1:], 0) 

plt.subplots_adjust(left=0.1, bottom=0.15, right=0.99, top=0.95) 
plt.imshow(plot_data, cmap=plt.cm.get_cmap("Reds"), interpolation="nearest", aspect = "auto") 
plt.xticks(range(len(labels)), labels, rotation=90, va="top", ha="center") 
plt.colorbar() 

plt.show() 

現在,我第一次讀到來自第一線的標籤。我將關鍵字參數aspect添加到imshow-調用。我爲每個因素創建標籤。

此外,我用subplots_adjust調整圖的位置。你可以玩這些參數,直到它們符合你的需求。

結果現在是: resulting heatmap

如果希望其他蜱爲Y軸,用plt.yticks,它就像在我的例子xticks

+0

基因組區域 – Angelo

+1

像這樣的東西我懷疑,所以你不會需要它 –

+0

@ Thorsten,抱歉打擾你,但圖像太狹窄,我沒有看到標籤(我的因素的名稱,我有67個):(請幫助 – Angelo

1

由於對我的其他答案的評論OP有關於搜索2d羣集的另一個問題。這是一些答案。

取自我的書庫eegpy,我使用find_clusters方法。它在2d陣列上執行一個步驟,查找所有高於/低於給定閾值的集羣。

這是我的代碼:

import pylab as plt 
import numpy as np 
from Queue import Queue 


def find_clusters(ar,thres,cmp_type="greater"): 
    """For a given 2d-array (test statistic), find all clusters which 
are above/below a certain threshold. 
""" 
    if not cmp_type in ["lower","greater","abs_greater"]: 
     raise ValueError("cmp_type must be in [\"lower\",\"greater\",\"abs_greater\"]") 
    clusters = [] 
    if cmp_type=="lower": 
     ar_in = (ar<thres).astype(np.bool) 
    elif cmp_type=="greater": 
     ar_in = (ar>thres).astype(np.bool) 
    else: #cmp_type=="abs_greater": 
     ar_in = (abs(ar)>thres).astype(np.bool) 

    already_visited = np.zeros(ar_in.shape,np.bool) 
    for i_s in range(ar_in.shape[0]): #i_s wie i_sample 
     for i_f in range(ar_in.shape[1]): 
      if not already_visited[i_s,i_f]: 
       if ar_in[i_s,i_f]: 
        #print "Anzahl cluster:", len(clusters) 
        mask = np.zeros(ar_in.shape,np.bool) 
        check_queue = Queue() 
        check_queue.put((i_s,i_f)) 
        while not check_queue.empty(): 
         pos_x,pos_y = check_queue.get() 
         if not already_visited[pos_x,pos_y]: 
          #print pos_x,pos_y 
          already_visited[pos_x,pos_y] = True 
          if ar_in[pos_x,pos_y]: 
           mask[pos_x,pos_y] = True 
           for coords in [(pos_x-1,pos_y),(pos_x+1,pos_y),(pos_x,pos_y-1),(pos_x,pos_y+1)]: #Direct Neighbors 
            if 0<=coords[0]<ar_in.shape[0] and 0<=coords[1]<ar_in.shape[1]: 
             check_queue.put(coords) 
        clusters.append(mask) 
    return clusters 

fn = "14318737.txt" 
with open(fn, "r") as f: 
    labels = f.readline().rstrip("\n").split()[1:] 
data = np.loadtxt(fn, skiprows=1, converters={0:lambda x: 0}) 

clusters = find_clusters(data, 0, "greater") 

plot_data = np.ma.masked_equal(data[:,1:], 0) 

plt.subplots_adjust(left=0.1, bottom=0.15, right=0.99, top=0.95) 
plt.imshow(plot_data, cmap=plt.cm.get_cmap("Reds"), interpolation="nearest", aspect = "auto", 
      vmin=0, extent=[0.5,plot_data.shape[1]+0.5, plot_data.shape[0] - 0.5, -0.5]) 
plt.colorbar() 

for cl in clusters: 
    plt.contour(cl.astype(np.int),[0.5], colors="k", lw=2) 
plt.xticks(np.arange(1, len(labels)+2), labels, rotation=90, va="top", ha="center") 


plt.show() 

其給出的形式的圖像:

Plot with contour around clusters

clusters是布爾2D陣列(真/假)的列表。每個arrray表示一個簇,其中每個布爾值指示特定「點」是否是該簇的一部分。您可以在任何進一步的分析中使用它。

編輯

一些更有趣

現在的集羣

import pylab as plt 
import numpy as np 
from Queue import Queue 


def find_clusters(ar,thres,cmp_type="greater"): 
    """For a given 2d-array (test statistic), find all clusters which 
are above/below a certain threshold. 
""" 
    if not cmp_type in ["lower","greater","abs_greater"]: 
     raise ValueError("cmp_type must be in [\"lower\",\"greater\",\"abs_greater\"]") 
    clusters = [] 
    if cmp_type=="lower": 
     ar_in = (ar<thres).astype(np.bool) 
    elif cmp_type=="greater": 
     ar_in = (ar>thres).astype(np.bool) 
    else: #cmp_type=="abs_greater": 
     ar_in = (abs(ar)>thres).astype(np.bool) 

    already_visited = np.zeros(ar_in.shape,np.bool) 
    for i_s in range(ar_in.shape[0]): #i_s wie i_sample 
     for i_f in range(ar_in.shape[1]): 
      if not already_visited[i_s,i_f]: 
       if ar_in[i_s,i_f]: 
        #print "Anzahl cluster:", len(clusters) 
        mask = np.zeros(ar_in.shape,np.bool) 
        check_queue = Queue() 
        check_queue.put((i_s,i_f)) 
        while not check_queue.empty(): 
         pos_x,pos_y = check_queue.get() 
         if not already_visited[pos_x,pos_y]: 
          #print pos_x,pos_y 
          already_visited[pos_x,pos_y] = True 
          if ar_in[pos_x,pos_y]: 
           mask[pos_x,pos_y] = True 
           for coords in [(pos_x-1,pos_y),(pos_x+1,pos_y),(pos_x,pos_y-1),(pos_x,pos_y+1)]: #Direct Neighbors 
            if 0<=coords[0]<ar_in.shape[0] and 0<=coords[1]<ar_in.shape[1]: 
             check_queue.put(coords) 
        clusters.append(mask) 
    return clusters 

fn = "14318737.txt" 
data = [] 
with open(fn, "r") as f: 
    labels = f.readline().rstrip("\n").split()[1:] 
    for line in f: 
     data.append([int(v) for v in line.split()[1:]]) 
data = np.array(data) #np.loadtxt(fn, skiprows=1, usecols=range(1,15))#converters={0:lambda x: 0}) 

clusters = find_clusters(data, 0, "greater") 
large_clusters = filter(lambda cl: cl.sum()>5, clusters) #Only take clusters with five or more items 
large_clusters = sorted(large_clusters, key=lambda cl: -cl.sum()) 

plot_data = np.ma.masked_equal(data[:,:], 0) 

plt.subplots_adjust(left=0.1, bottom=0.15, right=0.99, top=0.95) 
plt.imshow(plot_data, cmap=plt.cm.get_cmap("Reds"), interpolation="nearest", aspect = "auto", 
      vmin=0, extent=[-0.5,plot_data.shape[1]-0.5, plot_data.shape[0] - 0.5, -0.5]) 
plt.colorbar() 

for cl in large_clusters: 
    plt.contour(cl.astype(np.int),[.5], colors="k", lw=2) 
plt.xticks(np.arange(0, len(labels)+1), labels, rotation=90, va="top", ha="center") 

print "Summary of all large clusters:\n" 
print "#\tSize\tIn regions" 
for i, cl in enumerate(large_clusters): 
    print "%i\t%i\t" % (i, cl.sum()), 
    regions_in_cluster = np.where(np.any(cl, axis=0))[0] 
    min_region = labels[min(regions_in_cluster)] 
    max_region = labels[max(regions_in_cluster)] 
    print "%s to %s" % (min_region, max_region) 

plt.xlim(-0.5,plot_data.shape[1]-0.5) 

plt.show() 

我篩選具有包含在五點多所有集羣。我只繪製這些。您也可以使用每個羣集內的data的總和。然後我按大小排序這些大集羣,然後下降。

最後,我打印所有大型羣集的摘要,包括它們在 之間的所有羣集的名稱。 Large clusters only

+0

感謝您的更新代碼。由於我的數據是2700個地區,因此也可以根據行進行聚類。我得到一個非常討厭的圖像。 – Angelo

+0

你是什麼意思「基於行的集羣」。我的算法在行和列中搜索。你的意思是隻沿行搜索? –

+0

好吧。我是否也可以在某種變量中獲得這些集羣,並將它們的名稱從最大集羣(類似集羣1→E2F6和ELF1)開始顯示爲最小。 – Angelo