在Python中为无向图建模

在Python中为无向图建模,python,matplotlib,graph,networkx,Python,Matplotlib,Graph,Networkx,我试图用networkX绘制一个“网络图”,但结果是,这个库并不是我想要使用它的目的 因此,总结上面链接的失败问题,我从我想要绘制的数据开始,然后继续实际问题: graph = { '1': ['2', '3', '4'], '2': ['5','11','12','13','14','15'], '3' : ['6','7','66','77'], '5': ['6', '8','66','77'], '4': ['7','66','77'],

我试图用networkX绘制一个“网络图”,但结果是,这个库并不是我想要使用它的目的

因此,总结上面链接的失败问题,我从我想要绘制的数据开始,然后继续实际问题:

graph = {
    '1': ['2', '3', '4'],
    '2': ['5','11','12','13','14','15'],
    '3' : ['6','7','66','77'],
    '5': ['6', '8','66','77'],
    '4': ['7','66','77'],
    '7': ['9', '10']
}
将此数据视为defaultdict(列表),最左边的部分是键,右边的列表是该键的值列表。我想要实现的是绘制一个类似于网络图的图形:边越多,节点越大,标记节点,等等

但是,不同之处在于,我希望将键与相应的值(1与2、1与3、1与4)连接,但键彼此连接(1与2与3、5与4与7)

将数据镜像为服务器和客户端。键是服务器,值是客户端。服务器(密钥)彼此不直接连接,它们只共享(有时)相同的客户端。如上例,服务器3和服务器5都连接到客户端6、66和77。这也是为什么客户端(值)不应该彼此连接的原因

我希望能把我的问题说清楚^^


谢谢

问题是您试图对服务器和客户端使用相同的ID。NetworkX无法知道
2
指的是客户端(应该连接)还是服务器(不应该连接)。要执行这里描述的操作,只需为服务器创建一个唯一的id。例如:

import networkx

graph = {
    '1': ['2', '3', '4'],
    '2': ['5','11','12','13','14','15'],
    '3': ['6','7','66','77'],
    '5': ['6', '8','66','77'],
    '4': ['7','66','77'],
    '7': ['9', '10']
}

g = networkx.Graph()

for k, vs in graph.items():
    server_id = 'server_%s' % k

    for v in vs:
        g.add_edge(server_id,v)

networkx.draw_spring(g)
这将产生以下输出:

要根据边的数量更改节点的大小,需要计算大小并将其传递给
draw\u spring
。要获取特定节点的边数,可以调用
g.edges(node)
e.g

node_sizes = [150*len(g.edges(n)) for n in g.nodes()]
networkx.draw_spring(g, node_size=node_sizes)
这将为您提供以下信息:


为了确保我理解,这个图将有两个名为2的实体,但一个是“服务器”,一个是“客户端”,对吗?为什么你又问了同样的问题?用这些信息更新您的原始问题。@Elisha:是的,您是对的。@mfitzp:我不知道,我可以更改一个问题的标题:(非常感谢@mfitzp:这正是我要找的!很抱歉我不知道的“双帖”的混乱,问题的标题也可以在之后修改。在我最终将其标记为正确答案之前,有两件事:我需要添加一个plt.show()第二:是否可以根据边的数量使用“draw_spring”调整节点大小?@user1252280没问题!我已经根据边的数量使用大小节点更新了答案。
plt.show()
仅当您正在为
matplotlib
使用一个交互式后端时才需要。因此我省略了它。例如,如果您保存图形(
plt.gcf().savefig()
)或正在使用Jupyter笔记本,则不需要它。非常感谢您的最后调整:)