python.igraph - k821209/pipelines GitHub Wiki

import igraph as ig

g = ig.Graph() # igraph class 빙의
g.add_vertices(genenumber) # genenumber에는 총 유전자 숫자가 들어간다.   
dicN2G = dict(zip([x[0] for x in enumerate(genelist_total)],[x[1] for x in enumerate(genelist_total)]))
dicG2N = dict(zip([x[1] for x in enumerate(genelist_total)],[x[0] for x in enumerate(genelist_total)]))
# 번호와 유전자 이름을 대응한 딕셔너리를 만들어 둔다. 

for each in df_in.index: # 데이터 프레임엔 유전자 1:1의 상관관계가 들어감
    gn1 = df_in.loc[each][0].split('.')[0] # 유전자 1 
    gn2 = df_in.loc[each][1].split('.')[0] # 유전자 1에 연결되는 유전자 2
    n_gn1 = dicG2N[gn1]
    n_gn2 = dicG2N[gn2]
    g.add_edges([(n_gn1,n_gn2)])  # 앞에서 정해진 번호를 통해 vertex끼리의 link를 만든다.
    edge_idx = g.get_eid(n_gn1,n_gn2) # 방금 추가한 edge의 id가 뭘로 들어갔는지 확인
    g.es[edge_idx]['feature'] = 'homolog' # 해당 edge의 feature를 'homolog'로 라벨

for each in df_arainter.index: # 연결의 성격에 따라 따로 추가. 윗쪽은 호모로그, 이것은 단백질 상호작용
    gn1 = df_arainter.loc[each][0].split('.')[0]
    gn2 = df_arainter.loc[each][1].split('.')[0]
    n_gn1 = dicG2N[gn1]
    n_gn2 = dicG2N[gn2]
    test_g.add_edges([(n_gn1,n_gn2)])
    edge_idx = test_g.get_eid(n_gn1,n_gn2)
    test_g.es[edge_idx]['feature'] = 'interaction' # 해당 edge의 feature를 'interaction'으로 라벨


g_clusters = g.clusters() # g class 에 cluster() 메서드를 취하면 클러스터를 불러준다. 
remain_vertices = [] # 정해진 조건에 따라 클러스터를 걸러보자. 클러스터는 vertex가 edge에 묶인 덩이덩이 들을 의미
for cluster in test_g_clusters: 
    bOK = 0
    for each in cluster:
        gn = dicN2G[each].split('.')[0]
        if gn in drought_responsive_genes_list:
            bOK += 1
    if bOK != 0:
        #print 'number of hits', bOK
        #print cluster
        #print [test_g.vs[x]['name'] for x in cluster]
        #print gn
        if float(bOK)/float(len(cluster)) > 0.01:
            remain_vertices += cluster # 조건에 맞는 vertex만 하나의 리스트에 담는다.

        
sub_vs = test_g.vs.select(remain_vertices) # sub vertex를 vs.select()메서드로 만듬 -VerSeq이라는 모양으로 만들어짐
sub_g = test_g.subgraph(sub_vs) # verseq을 원래 g class에 subgraph 메서드로 입력해주면 해당 vertex로만 클레스를 다시 만들어준다. 

layout_fr = sub_g.layout('fr') # layout을 정해준다 보통 fr, kk 중에 골라 쓰면 될듯 딴건 별로 ㅋ
visual_style = {}
#visual_style["vertex_size"] = sub_g.vs.degree() # interaction 수에 따라 vertex크기를 키우라
visual_style["vertex_size"] = 5
visual_style["vertex_color"] = ['red' if x.split('.')[0] in drought_responsive_genes_list else 'grey' for x in sub_g.vs["name"]] # vertex숫자에 맞는 array로 넣어주면 되기때문에 알아서 잘 색깔을 넣어보자.
#visual_style["vertex_label"] = g.vs["name"]
#visual_style["edge_width"] = [1 + 2 * int(is_formal) for is_formal in g.es["is_formal"]]
visual_style["edge_color"] = ['red' if x == 'interaction' else 'blue' for x in sub_g.es["feature"]] # edge도 마찬가지
visual_style["layout"] = layout_fr
visual_style["bbox"] = (500, 500)
visual_style["margin"] = 20
ig.plot(sub_g, **visual_style)