【问题标题】:Fix position of subset of nodes in NetworkX spring graph修复 NetworkX 弹簧图中节点子集的位置
【发布时间】:2015-05-04 16:27:38
【问题描述】:

在 Python 中使用 Networkx,我试图想象不同的影评人是如何偏向某些制作公司的。为了在图表中显示这一点,我的想法是将每个生产公司节点的位置固定到一个圆圈中的单个位置,然后使用 spring_layout 算法来定位剩余的电影评论节点,这样就可以轻松地看看一些批评者是如何更倾向于某些制作公司的。

我的问题是我似乎无法修复生产公司节点的初始位置。当然,我可以固定他们的位置,但那只是随机的,我不希望这样——我希望他们围成一圈。我可以计算所有节点的位置,然后设置生产公司节点的位置,但这超出了使用 spring_layout 算法的目的,我最终得到了一些古怪的东西:

关于如何正确执行此操作的任何想法?

目前我的代码是这样做的:

def get_coordinates_in_circle(n):
    return_list = []
    for i in range(n):
        theta = float(i)/n*2*3.141592654
        x = np.cos(theta)
        y = np.sin(theta)
        return_list.append((x,y))
    return return_list

G_pc = nx.Graph()
G_pc.add_edges_from(edges_2212)

fixed_nodes = []
for n in G_pc.nodes():
    if n in production_companies:
        fixed_nodes.append(n)

pos = nx.spring_layout(G_pc,fixed=fixed_nodes)

circular_positions = get_coordinates_in_circle(len(dps_2211))
i = 0
for p in pos.keys():
    if p in production_companies:
        pos[p] = circular_positions[i]
        i += 1

colors = get_node_colors(G_pc, "gender")

nx.draw_networkx_nodes(G_pc, pos, cmap=plt.get_cmap('jet'), node_color=colors, node_size=50, alpha=0.5)
nx.draw_networkx_edges(G_pc,pos, alpha=0.01)
plt.show()

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    创建图表并设置几个位置:

    import networkx as nx
    G=nx.Graph()
    G.add_edges_from([(1,2),(2,3),(3,1),(1,4)]) #define G
    fixed_positions = {1:(0,0),2:(-1,2)}#dict with two of the positions set
    fixed_nodes = fixed_positions.keys()
    pos = nx.spring_layout(G,pos=fixed_positions, fixed = fixed_nodes)
    nx.draw_networkx(G,pos)
    

    您的问题似乎是您在设置固定节点的位置之前计算了所有节点的位置。

    在为固定节点设置pos[p]后将pos = nx.spring_layout(G_pc,fixed=fixed_nodes)移动到pos = nx.spring_layout(G_pc,pos=pos,fixed=fixed_nodes)

    dictpos 存储每个节点的坐标。您应该快速查看the documentation。特别是,

    pos : dict 或 None 可选(默认=None)。 节点的初始位置作为字典,节点作为键,值作为列表或元组。如果没有,则使用随机初始位置。

    固定:列表或无可选(默认=无)。 节点保持固定在初始位置。 列表或无可选(默认=无)

    您告诉它将这些节点固定在其初始位置,但您没有告诉它们初始位置应该是什么。所以我相信它会随机猜测那个初始位置,并保持它固定。但是,当我对此进行测试时,似乎遇到了错误。看来,如果我告诉(我的版本)networkx 将[1,2] 中的节点固定为固定,但我没有告诉它它们的位置是什么,我会得到一个错误(在这个答案的底部)。所以我很惊讶你的代码正在运行。


    关于使用列表推导对代码进行的其他一些改进:

    def get_coordinates_in_circle(n):
        thetas = [2*np.pi*(float(i)/n) for i in range(n)]
        returnlist = [(np.cos(theta),np.sin(theta)) for theta in thetas]
        return return_list
    
    G_pc = nx.Graph()
    G_pc.add_edges_from(edges_2212)
    circular_positions = get_coordinates_in_circle(len(dps_2211))
    #it's not clear to me why you don't define circular_positions after
    #fixed_nodes with len(fixed_nodes) so that they are guaranteed to 
    #be evenly spaced.
    
    fixed_nodes = [n for n in G_pc.nodes() if n in production_companies]
    
    pos = {}
    for i,p in enumerate(fixed_nodes):
        pos[p] = circular_positions[i]
    
    colors = get_node_colors(G_pc, "gender")
    pos = nx.spring_layout(G_pc,pos=pos, fixed=fixed_nodes)
    nx.draw_networkx_nodes(G_pc, pos, cmap=plt.get_cmap('jet'), node_color=colors, node_size=50, alpha=0.5)
    nx.draw_networkx_edges(G_pc,pos, alpha=0.01)
    plt.show()
    

    这是我看到的错误:

    import networkx as nx
    G=nx.Graph()
    G.add_edge(1,2)
    pos = nx.spring_layout(G, fixed=[1,2])
    
    ---------------------------------------------------------------------------
    UnboundLocalError                         Traceback (most recent call last)
    <ipython-input-4-e9586af20cc2> in <module>()
    ----> 1 pos = nx.spring_layout(G, fixed=[1,2])
    
    .../networkx/drawing/layout.pyc in fruchterman_reingold_layout(G, dim, k, pos, fixed, iterations, weight, scale)
        253            # We must adjust k by domain size for layouts that are not near 1x1
        254            nnodes,_ = A.shape
    --> 255            k=dom_size/np.sqrt(nnodes)
        256         pos=_fruchterman_reingold(A,dim,k,pos_arr,fixed,iterations)
        257     if fixed is None:
    
    UnboundLocalError: local variable 'dom_size' referenced before assignment
    

    【讨论】:

    • 感谢您的回答。你得到什么错误?对我来说,您似乎在声明之前向 pos 添加了职位。为了解决您的代码注释,这些位置将是均匀的空格,因为 len(dps_2211) == len(fixed_nodes)。我明白为什么这令人困惑。但是您的解决方案有效。事实证明,重要的是创建“pos”并为其添加位置,然后使用您刚刚创建的“pos”进行计算。谢谢
    • 您在声明之前向pos 添加内容是正确的(我批准了您的编辑)。我将在我的答案底部添加我得到的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2016-02-08
    • 2012-12-03
    • 2017-10-09
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多