为什么 Networkx 中的图表箭头指向错误的方向?

问题描述 投票:0回答:1

我有一个包含两列的 pandas 数据框:源和接收器。在简化的形式中,只有 5 个用户(源列)可以欠任何其他用户(汇列)的钱。 我认为下面的代码会显示用户 1 由于用户 3(是的箭头正确,好)、用户 2 到 4(好)、3 到 5(好)、4 到 1(错误)、5 到 2 的绘图(错误的)。我该怎么做才能让最后两个箭头指向正确的方向?

output of the sample code

df = pd.DataFrame({'source': [1, 2, 3, 4, 5], 'sink': [3, 4, 5, 1, 2]})

G = nx.Graph()
for row in df.iterrows():
    print(row[1]['source'], row[1]['sink'])
    G.add_edge(row[1]['source'], row[1]['sink'])
# nx.draw(G, with_labels=True, font_weight='bold')

pos = nx.spring_layout(G)
nodes = nx.draw_networkx_nodes(G, pos, node_color="orange")
nx.draw_networkx_labels(G, pos)
edges = nx.draw_networkx_edges(
    G,
    pos,
    arrows=True,
    arrowstyle="->",
    arrowsize=10,
    width=2,
)
python graph networkx permutation
1个回答
0
投票

这是由于用户的顺序。如果仔细观察图表,箭头总是从

U
指向
V
,其中
U < V
。实际上,networkx 使用
FancyArrowPatch(start, end, ...)
来制作箭头,如本例所示:

import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch

fig, ax = plt.subplots()

ax.add_patch(
    FancyArrowPatch((0.2, 0.5), (0.8, 0.5), mutation_scale=30, arrowstyle="-|>")
)

enter image description here

你想要的是

DiGraph
,箭头应该与 :

一起使用
DG = nx.from_pandas_edgelist(df, "source", "sink", create_using=nx.DiGraph)
nx.draw_networkx(
    DG,
    nx.spring_layout(DG, seed=0),
    node_color="orange",
    edgecolors="k",
    arrowsize=20,
)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.