gpt4 book ai didi

python - 生成源后使用 graphviz 更改特定节点的颜色

转载 作者:行者123 更新时间:2023-12-04 04:20:56 27 4
gpt4 key购买 nike

我有一个 python 数据框,我想在 graphviz 中可视化。一切正常,除了我想在绘制网络后更改节点的颜色。

数据框看起来像这样:

Sender   Receiver   Amount     Sender_Part_Of_Group?          Receiver_Part_Of_Group?
A B 88 1 0
C B 71 0 0
B D 32 0 1
D A 26 1 1

我用了G = nx.convert_matrix.from_pandas_edgelist(df,"Sender","Receiver","Amount", create_using = nx.multiDiGraph())创建一个 NetworkX 对象。

然后我使用了 dot = nx.nx_pydot.to_pydot(G)创建一个点对象。

最后,我这样做了:

from graphviz import Source
sc = Source(dot, filename = "plot", format = "png", engine = "fdp")
sc.render

这是我得到的图表。

enter image description here

现在我想根据节点是否属于组(df 的最后两列)为所有节点着色。推进这项工作的最佳方式是什么?我不想手动构建节点和边,因为 DataFrame 非常大。这是我最希望拥有的,因为 A 和 D 是组的一部分,而 B 和 C 不是:

enter image description here

最佳答案

您可以通过遍历 DataFrame 的每一行并设置每个节点的属性来完成此操作。我们感兴趣的属性是 'style''color'。我们要检查发送方或接收方是否在组中,如果是,则相应地为发送方或接收方节点着色。

from graphviz import Source
import pandas as pd
import networkx as nx

df = pd.DataFrame({'Sender': {0: 'A', 1: 'C', 2: 'B', 3: 'D'},
'Receiver': {0: 'B', 1: 'B', 2: 'D', 3: 'A'},
'Amount': {0: 88, 1: 71, 2: 32, 3: 26},
'Sender_Part_Of_Group?': {0: 1, 1: 0, 2: 0, 3: 1},
'Receiver_Part_Of_Group?': {0: 0, 1: 0, 2: 1, 3: 1}})

G = nx.convert_matrix.from_pandas_edgelist(df,"Sender","Receiver","Amount", create_using = nx.MultiDiGraph())

for i, row in df.iterrows():
G.nodes[row['Sender']]['style'] = 'filled'
if row['Sender_Part_Of_Group?']:
G.nodes[row['Sender']]['color'] = 'red'
else:
G.nodes[row['Sender']]['color'] = 'blue'
if row['Receiver_Part_Of_Group?']:
G.nodes[row['Receiver']]['color'] = 'red'
else:
G.nodes[row['Receiver']]['color'] = 'blue'

dot = nx.nx_pydot.to_pydot(G)

sc = Source(dot, filename = "plot", format = "png", engine = "fdp")
sc.render()

给我们:

enter image description here

关于python - 生成源后使用 graphviz 更改特定节点的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59376635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com