【问题标题】:Plotting a Network Graph with all edges clearly visible绘制所有边清晰可见的网络图
【发布时间】:2015-03-19 02:58:42
【问题描述】:

我有 30 个节点的图网络数据(使用邻接矩阵)。该图目前如下所示:

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

我使用 networkx lib 的以下命令绘制了这个。

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

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

请指教。

编辑:

想要这样的东西,每个节点清晰,边缘可见且不浓缩。关键是我希望上面的聚类点只显示在该聚类附近,而对于较低的聚类点也是如此。但是在每个集群中,我希望节点有点分开,以便每个边缘都清晰可见。

编辑2:

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

我还看到,每次运行代码时,图表的布局都会发生变化。我不希望图形布局随着代码的每次运行而改变。目前它正在这样做。

【问题讨论】:

    标签: python numpy pandas matplotlib


    【解决方案1】:

    您是否尝试过对其应用节点定位布局? networkx 库支持布局。看看here。我个人会推荐使用Fruchterman-Reingold force-directed 算法的弹簧布局。相关文档是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
    

    注意,我刚刚从 Stack 上的另一个问题中找到了这些参数的解释,您可以在这里找到:How to increase node spacing for networkx.spring_layout

    让我知道这是否有帮助。

    【讨论】:

    • 您好,谢谢。但这似乎不起作用。我的意思是我尝试了 spring_layout、spectral_layout 甚至其他,但它给了我图表但不是很明显。大多数节点彼此非常接近。我想要一些节点有点分开的东西,这样每个边缘都可以清晰可见。见上文的前任。
    • 刚刚添加了一些,如果有帮助请告诉我。我没有一个样本数据集来运行它,所以我很难预先测试它。如果您可以在 pastebin 或其他工具中提供 Numpy 数据集的粘贴,我可以尝试帮助找到好的参数。
    • 帮助不大。问题是当您调整 k 值时,它会增加所有节点之间的距离。我想要的是图形应该显示为两个顶点集的集群。每个集群有 15 个节点。但是在每个集群内,边缘应该是清晰的,节点应该有一定的距离。我添加了我的代码来创建用于创建上面图表的相邻矩阵。
    • 如果您觉得由于集群中的边太多而无法实现,我将添加另一个代码,该代码创建一个邻接矩阵,其中并非集群中的每个节点都与其他节点都有边。我也尝试过,但仍然不是很清晰的图表。见编辑 3
    • 我认为问题在于节点没有得到排序。如果节点是有序的并且该顺序保持固定,那么我们可以得到边缘,因为我选择了有点远的点节点,以便清楚地看到边缘。 (编辑 3 代码)。
    【解决方案2】:

    问题是您拥有非常高密度的集群。那么布局算法将很难使每个边缘都完全清晰。创建一个好的布局可能很困难。

    我建议您尝试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)
    

    生产:

    在我看来,这似乎清晰明了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2020-12-16
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      相关资源
      最近更新 更多