我有一个包含两列的 pandas 数据框:源和接收器。在简化的形式中,只有 5 个用户(源列)可以欠任何其他用户(汇列)的钱。 我认为下面的代码会显示用户 1 由于用户 3(是的箭头正确,好)、用户 2 到 4(好)、3 到 5(好)、4 到 1(错误)、5 到 2 的绘图(错误的)。我该怎么做才能让最后两个箭头指向正确的方向?
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,
)
这是由于用户的顺序。如果仔细观察图表,箭头总是从
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="-|>")
)
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,
)