2015-03-19 61 views
1

我有一个30个节点的图网络数据(使用邻接矩阵)。图表目前看起来像这样:绘制一个网络图,所有的边都清晰可见

enter image description here

每个集群有15个节点,每个节点都连接到其他节点同一群集内。只有两对不同集群的节点相互连接。问题是我得到的图形全部是浓缩的,集群内的每条边都不清晰可见。有没有一种方法可以清楚地显示群集中的每个边缘。主要就像使图形更大,每个节点的边缘线清晰可见。

我使用networkx lib的以下命令对此进行了绘制。

G1=nx.from_numpy_matrix(W1) 
nx.draw_networkx(G1) 

其中W1是节点的邻接矩阵(30x30)。

请指教。

编辑:

想是这样的,每个节点清晰,边缘可见和不凝结。重点是我希望上部群集点仅出现在该群集附近,而对于较低群集点则相同。但是在每个集群中,我希望节点有点分离,以便每个边都清晰可见。

enter image description here

EDIT2:

def adjacencyMatrix2(): 
    for x in range(N): 
     if (x<15): 
      c=N/2 
     else: 
      c=N 
     for y in range(x+1,c): 
      W1[x][y]=W1[y][x]=1 

# Connecting two other nodes separately. 
W1[0][16]=W1[16][0]=1 
W1[1][15]=W1[15][1]=1 

adjacencyMatrix2() 
G1=nx.from_numpy_matrix(W1) 
graph_pos=nx.spring_layout(G1,k=0.50,iterations=50) 
nx.draw_networkx(G1,graph_pos) 

EDIT3:

N=30 
# Creating a matrix of zeros. 
W=np.zeros((N,N)) 
# Mentioning the edges to start with. Thinking of a pair of 15 node cluster with two cluster connected by two pair of nodes. 
edge=[[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12],[1,13],[1,14],[1,15], 
     [16,17],[16,18],[16,19],[16,20],[16,21],[16,22],[16,23],[16,24],[16,25],[16,26],[16,27],[16,28],[16,29],[16,30], 
     [1,16],[2,17],[2,3],[5,6],[8,9],[9,4],[18,26],[17,22],[29,21],[17,28]] 

# Function for creating adjacency matrix ,populating the zeros matrix with 1 and 0-signifying edges on a node. 

def adjacencyMatrix(): 
    """This function creates an Adjacency Matrix from a edge set. 
    input-> set of edges to be connected 
    output-> Adjacency matrix (n,n) 
    """ 
    for first,second in edge: 
     W[first-1,second-1]=W[second-1][first-1]=1 

# Creating the adjacency matrix by calling the function. 
adjacencyMatrix() 

另外我看到的代码的每次运行的曲线图的变化的布局。我不希望图形布局随代码的每次运行而改变。目前正在这样做。

回答

2

您是否尝试过应用节点定位布局? networkx库支持布局。看看here。我个人会推荐使用Fruchterman-Reingold力定向算法的弹簧布局。相关文档是here。要真正在库运行此,你可以尝试这样的:

pos=nx.spring_layout(G1) 

其中pos是由每个节点键位置的字典。

编辑:您可以使用上述文档中引用的参数控制布局的确切间距。具体来说,是这样的:

nx.spring_layout(G,k=0.15,iterations=20) 
# k controls the distance between the nodes and varies between 0 and 1 
# iterations is the number of times simulated annealing is run 
# default k =0.1 and iterations=50 

注意,我只是发现这些参数从栈另外一个问题,你可以在这里找到解释:How to increase node spacing for networkx.spring_layout

让我知道这是否有帮助。

+0

嗨,谢谢。但它似乎并不奏效。我的意思是我尝试了spring_layout,spectral_layout,甚至其他人,但它给我的图形,但不是很明显。大多数节点彼此非常接近。我想要一些节点有点分离的东西,以便每个边都清晰可见。参见上面的例子。 – Baktaawar 2015-03-19 04:06:23

+0

只需添加一些,让我知道它是否有帮助。我没有一个样本数据集来运行它,所以我很难预先测试它。如果您可以在pastebin或其他工具中提供Numpy数据集的粘贴,我可以尝试帮助找到好的参数。 – 2015-03-19 04:12:31

+0

没什么帮助。问题是当你调整k值时,它会增加所有节点之间的距离。我想要的是该图应该显示为两个顶点集合的集群。每个群集有15个节点。但是在每个簇内边缘应该清晰,节点应该有一定的距离。我已经添加了我的代码来创建用于创建上图的相邻矩阵。 – Baktaawar 2015-03-19 04:24:05

0

问题是你有很高密度的簇。那么布局算法很难使每条边都完美清晰。创建一个好的布局可能很困难。

我建议你试试Graphviz,它提供了非常好的布局调整,可以提供你想要的布局。您可以使用networkx.draw_graphviz从Networkx拨打Graphviz。

关于最终布局的随机性,这是由于布局算法中初始布局通常是随机的。我不知道是否有办法在Networkx中进行随机化。

关于减少边数的第三次编辑,我没有看到问题。

import networkx as nx 
edges = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 10], [1, 11], [1, 12], [1, 13], [1, 14], [1, 15], [16, 17], [16, 18], [16, 19], [16, 20], [16, 21], [16, 22], [16, 23], [16, 24], [16, 25], [16, 26], [16, 27], [16, 28], [16, 29], [16, 30], [1, 16], [2, 17], [2, 3], [5, 6], [8, 9], [9, 4], [18, 26], [17, 22], [29, 21], [17, 28]] 
g = nx.Graph(edges) 
nx.draw_networkx(g) 

产地:

Example of graph layout

这似乎根据我清楚明确。

相关问题