如何在 networkx 图中显示连接列表?
How to display list of connections in a networkx graph?
我的 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 上看到 this and this 悬停功能。
关于如何将其嵌入我的代码的任何想法?谢谢!
请参阅教程 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)
要点:
- return 散点 (
PathCollection
) 用于交互工作。
我的 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 上看到 this and this 悬停功能。 关于如何将其嵌入我的代码的任何想法?谢谢!
请参阅教程 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)
要点:
- return 散点 (
PathCollection
) 用于交互工作。