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

Changing the color of specific nodes using graphviz after generating source

我有一个 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

这是我得到的图表。

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

您可以通过遍历 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()

给我们: