2014-03-27 90 views
2

我試圖讓顯卡在networkx其中節點組鏈接爲在此圖:如何應對networkx圖形重疊節點

graph

然而,一些節點顯示出來的其他人以中性色彩呈現。

我想知道是否有一種方法要麼:

  • 顏色只爲每個子組(例如,一個用紅色節點)一個節點 - 其他與中性色;
  • 或爲所有節點着色。

這是我的代碼:

def draw_graph(transactions, method, suffix): 

    G = nx.Graph() 

    # get the string prefixes for each group (column of nodes) 
    # possible prefixes are: aa, bb, cc, etc. 
    prefixes = [c[:2] for c in classifiers] 

    # for each transaction, use also a unique index (i_t) 
    for i_t, t in enumerate(transactions): 

     # tid is the groups signature, e.g. if the tuple of 
     # classification is ('1', '2', '1') tid is 121 
     # tid has always 3 characters - there are only 3 
     # with at maximum 7 classifications in each group 
     tid = ''.join([c[2] for c in t]) 

     # nodes have name the concatenated string composed of: 
     # * classification (e.g. aa1) <- please note prefix 
     # * tid (e.g. 121) 
     # * unique identifier 
     node1 = t[0] + tid + str(i_t) 
     node2 = t[1] + tid + str(i_t) 
     node3 = t[2] + tid + str(i_t) 

     # link correspondent nodes on each group 
     G.add_edge(node1, node2, weight=0.2) 
     G.add_edge(node2, node3, weight=0.2) 

    # based on prefix decide in which group store the node 
    pos = {} 
    group1 = [] 
    group2 = [] 
    group3 = [] 
    for node in G.nodes(): 
     if node.startswith(prefixes[0]): 
      group1.append(node) 
     elif node.startswith(prefixes[1]): 
      group2.append(node) 
     else: 
      group3.append(node) 

    # sort each group by classification AND tid 
    group1.sort(key=lambda x: x[2:6]) 
    group2.sort(key=lambda x: x[2:6]) 
    group3.sort(key=lambda x: x[2:6]) 

    # define position for each node based on group and index 
    # of node inside the group 
    for i_group, group in enumerate([group1, group2, group3]): 
     for i_node, node in enumerate(group): 
      xpos = float(i_group) * 2 
      ypos = float(i_node)/len(group) 
      pos[node] = [xpos, ypos] 

    # decide node color based on classification (nn[2]). 
    # avail_colors is a list of colors defined outside this method 
    node_color = [avail_colors[int(nn[2])] for nn in G.nodes()] 

    # draw each node with correspondent position and color 
    nx.draw_networkx_nodes(G, pos, node_size=200, node_color=node_color) 

    # draw edges with defined weight (not used in this example) 
    for (u, v, d) in G.edges(data=True): 
     w = d['weight'] 
     nx.draw_networkx_edges(G, pos, edgelist=[(u, v)], width=w) 


    plt.axis('off') 
    plt.close() 

希望這是可以理解的。如果不問我信息。

謝謝

+0

有兩種節點着色需求的方法。你可以發佈一個小代碼,顯示你是如何做到這一點的?然後,我們可以就如何修改它來做你想做的事情提出建議。 – Aric

+0

對不起。我忘了發佈它。我儘快發佈。 – gc5

+0

@Aric發佈。謝謝 – gc5

回答

-1

我發現,在我的情況,事情能解決我的問題是設置

linewidths=0 
draw_networkx_nodes()

,因爲它是創建效果圈的邊界的重疊。

希望它有幫助。

4

這可能不是你想要的。您可以像這樣控制各個節點的顏色,透明度和相對重疊;

import matplotlib.pyplot as plt 
import networkx as nx 

G = nx.Graph() 
G.add_node(1) 
G.add_node(2) 
G.add_node(3) 

pos = {1:(0.99,1.0), 2:(1.0,1.0), 3:(1.01,1.0)} 

r = nx.draw_networkx_nodes(G, pos, nodelist=[1], node_color='r', node_size=30000) 
g = nx.draw_networkx_nodes(G, pos, nodelist=[2], node_color='g', node_size=30000) 
b = nx.draw_networkx_nodes(G, pos, nodelist=[3], node_color='b', node_size=30000) 
r.set_zorder(3) # move red node to front 
b.set_alpha(0.05) # make blue node (almost) "invisible" 
plt.xlim(0.95,1.05) 
plt.axis('off') 
plt.show() 

enter image description here