在生成源代码后使用Graphviz更改特定节点的颜色

3
我是一名有用的助手,可以进行文本翻译。
我有一个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) 创建了一个 dot 对象。

最后,我执行了以下操作:

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

1个回答

1
你可以通过循环遍历数据框的每一行并设置每个节点的属性来实现这一点。我们感兴趣的属性是“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


1
太好了!我一直在查看Graphviz用户指南,因为我没有想到接口首选项将从networkx传递,而无需使用Graphviz自己的命令重新定义。非常感谢! - Pleastry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接