【问题标题】:How to display list of connections in a networkx graph?如何在networkx图中显示连接列表?
【发布时间】:2020-09-21 09:43:20
【问题描述】:

我的 networkx 加权图目前有以下代码:

import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()

G.add_edge("sam", "ben", weight=0.6)
G.add_edge("sam", "ted", weight=0.2)
G.add_edge("ted", "may", weight=0.1)
G.add_edge("ted", "chris", weight=0.7)
G.add_edge("ted", "nick", weight=0.9)
G.add_edge("sam", "may", weight=0.3)

elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] > 0.5]
esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] <= 0.5]

pos = nx.circular_layout(G)  # positions for all nodes

# nodes
nx.draw_networkx_nodes(G, pos, node_size=700)

# edges
nx.draw_networkx_edges(G, pos, edgelist=elarge, width=6)
nx.draw_networkx_edges(
    G, pos, edgelist=esmall, width=6, alpha=0.5, edge_color="b", style="dashed"
)

# labels
nx.draw_networkx_labels(G, pos, font_size=20, font_family="sans-serif")

plt.axis("off")
plt.show()

它给出以下输出:

我一直在搜索,但找不到将鼠标悬停在节点上并列出其所有连接的方法。例如:如果我将鼠标悬停在节点 A 上,我会知道它连接到 B、C 和 D 以及它们各自的权重。我在 Bokeh 上看到了 thisthis 悬停功能。 关于如何将其嵌入到我的代码中的任何想法?谢谢!

【问题讨论】:

    标签: python python-3.x matplotlib networkx


    【解决方案1】:

    请参阅教程here。以下是根据您的数据提供的解决方案。

    import matplotlib.pyplot as plt
    import networkx as nx
    
    G = nx.Graph()
    
    G.add_edge("a", "b", weight=0.6)
    G.add_edge("a", "c", weight=0.2)
    G.add_edge("c", "d", weight=0.1)
    G.add_edge("c", "e", weight=0.7)
    G.add_edge("c", "f", weight=0.9)
    G.add_edge("a", "d", weight=0.3)
    
    elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] > 0.5]
    esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] <= 0.5]
    
    fig, ax = plt.subplots(figsize=(7.2, 7.2))
    pos = nx.circular_layout(G)  # positions for all nodes
    names = np.array(list("abcdef"))
    
    # nodes
    # you have to return sc to for interaction to work
    sc = nx.draw_networkx_nodes(G, pos, node_size=700)
    
    # edges
    nx.draw_networkx_edges(G, pos, edgelist=elarge, width=6)
    nx.draw_networkx_edges(
        G, pos, edgelist=esmall, width=6, alpha=0.5, edge_color="b", style="dashed"
    )
    
    # labels
    nx.draw_networkx_labels(G, pos, font_size=20, font_family="sans-serif")
    
    annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
                        bbox=dict(boxstyle="round", fc="w"),
                        arrowprops=dict(arrowstyle="->"))
    annot.set_visible(False)
    
    def update_annot(ind):
    
        pos = sc.get_offsets()[ind["ind"][0]]
        annot.xy = pos
        es = [e for e in G[names[ind["ind"]][0]]]
        text = "{}".format(es)
        annot.set_text(text)
        annot.get_bbox_patch().set_alpha(0.4)
    
    
    def hover(event):
        vis = annot.get_visible()
        if event.inaxes == ax:
            cont, ind = sc.contains(event)
            if cont:
                update_annot(ind)
                annot.set_visible(True)
                fig.canvas.draw_idle()
            else:
                if vis:
                    annot.set_visible(False)
                    fig.canvas.draw_idle()
    
    fig.canvas.mpl_connect("motion_notify_event", hover)
    

    要点

    • 返回分散点 (PathCollection) 以使交互生效。

    【讨论】:

    • 谢谢!我对 python 很陌生,所以很抱歉问了一个愚蠢的问题,但是 return sc 会去哪里?
    • update_annot()内,如果解决了你的问题,请采纳。
    • 我将 return sc 放在 update_annot() 下,但没有弹出图表。
    • 对不起!它现在可以工作了,只是意识到你最后错过了 plt.show() ,这就是它不工作的原因。谢谢你:)
    • 请复制粘贴我的代码,它应该可以正常工作。没有在update_annot 中返回sc,从nx.draw_networkx_nodes 中返回sc,我已经为你做到了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2014-04-14
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多