networkx :绘制具有共同属性的图

networkx : Plot a graph with common attributes

我正在尝试创建一个包含节点和边的图形。我拥有的数据分为成员和他们所采用的主题。现在我以这种形式处理数据,其中对于每个主题我都找到了参与该主题的成员:

T498    ['M1', 'M3', 'M5', 'M7', 'M16', 'M20']                  
T611    ['M2', 'M3', 'M4', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12', 'M13', 'M14', 'M15', 'M17', 'M18', 'M19']

如何将这些成员节点加入该主题? 另外,如果我对每个成员都有回复,如“是”、“否”,我如何将它们用作权重?

节点和边就像字典,可以包含您想要的任何类型的信息。例如,您可以标记每个节点是主题还是成员,当需要绘制时,您可以根据该信息定义其标签、大小、颜色、字体大小等。

这是一个基本示例,您可以根据成员的响应更改每条边的颜色,而不是根据其厚度或其他一些属性。

import matplotlib.pyplot as plt
import networkx as nx

topics = {
    'T498': [('M1', 0), ('M3', 1), ('M5', 1), ('M7', 0), ('M8', 0)],
    'T611': [('M2', 1), ('M3', 1), ('M4', 0), ('M6', 1), ('M7', 0)],
}

G = nx.Graph()
for topic, members in topics.items():
    # You just need `G.add_node(node)`, everything else after that is an attribute
    G.add_node(topic, type='topic')
    for member, response in members:
        if member not in G.nodes:
            G.add_node(member, type='member')
        # `G.add_edge(node1, node2)`, the rest are attributes
        G.add_edge(topic, member, response=response)

node_sizes = [1000 if attrs['type'] == 'topic' else 500 for attrs in G.nodes.values()]
node_colors = ['r' if attrs['type'] == 'topic' else '#1f78b4' for attrs in G.nodes.values()]
edge_colors = ['y' if attrs['response'] else 'k' for attrs in G.edges.values()]
pos = nx.spring_layout(G)
nx.draw_networkx_labels(G, pos)
nx.draw(G, pos, node_size=node_sizes, node_color=node_colors, edge_color=edge_colors)
plt.show()

输出