【问题标题】:Scaling NetworkX nodes and edges proportional to adjacency matrix与邻接矩阵成比例缩放 NetworkX 节点和边
【发布时间】:2016-10-14 17:16:12
【问题描述】:

NetworkX 是否具有与邻接矩阵频率/节点-节点频率成比例的缩放节点和边的内置方法?我正在尝试根据邻接矩阵频率缩放节点和文本的大小,并根据节点-节点频率调整边缘的权重。我已经为图表创建了一个频率属性,但这并不能解决我向图表传递有关节点-节点频率的信息的问题。

所以两部分的问题:
1) 将邻接矩阵转换为 networkX 图的最佳实践是什么?
2)我如何使用这些信息来缩放节点的大小和边的权重?

## Compute Graph (G)
G = nx.Graph(A)

## Add frequency of word as attribute of graph
def Freq_Attribute(G, A):
    frequency = {}  # Dictionary Declaration
    for node in G.nodes():
        frequency[str(node)] = A[str(node)][str(node)]
    return nx.set_node_attributes(G, 'frequency', frequency)

Freq_Attribute(g,A) # Adds attribute frequency to graph, for font scale

## Plot Graph with Labels
plt.figure(1, figsize=(10,10))

# Set location of nodes as the default
pos = nx.spring_layout(G, k=0.50, iterations=30)  

# Nodes
node_size = 10000
nodes1 = nx.draw_networkx_nodes(G,pos,
                       node_color='None',
                       node_size=node_size,
                       alpha=1.0)  # nodelist=[0,1,2,3],
nodes1.set_edgecolor('#A9C1CD') # Set edge color to black

# Edges
edges = nx.draw_networkx_edges(G,pos,width=1,alpha=0.05,edge_color='black')
edges.set_zorder(3)

# Labels
nx.draw_networkx_labels(G,pos,labels=nx.get_node_attributes(G,'label'),
                        font_size=16, 
                        font_color='#062D40',
                        font_family='arial')  # sans-serif, Font=16
# node_labels = nx.get_node_attributes(g, 'name') 
# Use 'g.graph' to find attribute(s): {'name': 'words'}

plt.axis('off')
#plt.show()

我尝试设置标签 font_size,但这不起作用。: font_size=nx.get_node_attributes(G,'频率')) + 8)

【问题讨论】:

    标签: python text graph networkx


    【解决方案1】:

    我尝试了以下方法来满足您的需求:

    import networkx as nx
    import matplotlib.pyplot as plt
    
    ## create nx graph from adjacency matrix
    def create_graph_from_adj(A):
        # A=[(n1, n2, freq),....]
        G = nx.Graph()
        for a in A:
            G.add_edge(a[0], a[1], freq=a[2])
        return G
    
    A = [(0, 1, 0.5), (1, 2, 1.0), (2, 3, 0.8), (0, 2, 0.2), (3, 4, 0.1), (2, 4, 0.6)]
    ## Compute Graph (G)
    G = create_graph_from_adj(A)
    
    plt.subplot(121)
    
    # Set location of nodes as the default
    spring_pose = nx.spring_layout(G, k=0.50, iterations=30)  
    
    nx.draw_networkx(G,pos=spring_pose)
    
    
    plt.subplot(122)
    # Nodes
    default_node_size = 300
    default_label_size = 12
    node_size_by_freq = []
    label_size_by_freq = []
    for n in G.nodes():
        sum_freq_in = sum([G.edge[n][t]['freq'] for t in G.neighbors(n)])
        node_size_by_freq.append(sum_freq_in*default_node_size)
        label_size_by_freq.append(int(sum_freq_in*default_label_size))
    
    nx.draw_networkx_nodes(G,pos=spring_pose,
                           node_color='red',
                           node_size=node_size_by_freq,
                           alpha=1.0)  
    nx.draw_networkx_labels(G,pos=spring_pose,
                            font_size=12,  #label_size_by_freq is not allowed
                            font_color='#062D40',
                            font_family='arial') 
    
    # Edges
    default_width = 5.0
    edge_width_by_freq = []
    for e in G.edges():
        edge_width_by_freq.append(G.edge[e[0]][e[1]]['freq']*default_width)
    nx.draw_networkx_edges(G,pos=spring_pose,
                           width=edge_width_by_freq,
                           alpha=1.0,
                           edge_color='black')
    
    plt.show()
    

    首先,邻接反应不是以矩阵格式给出的,但恕我直言,这太乏味了。

    其次,nx.draw_networkx_labels 不允许标签使用不同的字体大小。帮不上忙。

    最后,边缘宽度和节点大小允许这样做。因此,它们分别根据其频率和输入频率的总和进行缩放。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多