如何为具有嵌套节点的嵌套数据绘制 networkx MultiGraph,嵌套节点的大小作为字典中的值?

How to draw a networkx MultiGraph for nested data that has nested nodes with sizes as values in the dict?

我正在尝试显示 2 个未连接的图表,它们表示数据如下 -

demo_data = {"TOPIC1": {"SIZE": 50, 
                        "WORDS": {"cat": 20, "dog": 30}}, 
             "TOPIC2": {"SIZE": 25, 
                        "WORDS": {"bat": 4, "rat": 9}}}

从我控制它的方式的意义上说,数据是灵活的 nested/looks。主要思想是能够显示如下图 -

有 2 个主要节点 - Topic1Topic2,它们的大小分别为 50 和 25。 Topic1 是 connected/surrounded by Cat 个大小为 20 的节点和 Dog 个大小为 30 的节点。 Topic2 同样如此。 Topic1Topic2 没有连接 - 但这是灵活的。 如果数据的不同表示更适合它,那也行。

我如何根据给定数据制作图表? 到目前为止我尝试过的是 -

import networkx as nx

demo_data = {"TOPIC1": {"SIZE": 500, "WORDS": {"cat": 1, "dog": 300}}, "TOPIC2": {"SIZE": 25, "WORDS": {"bat": 50, "rat": 90}}}

G = nx.MultiGraph()
G.add_nodes_from(demo_data.keys())
G.add_nodes_from(demo_data['TOPIC1']['WORDS'], node_size=demo_data['TOPIC1']['WORDS'].values())
G.add_nodes_from(demo_data['TOPIC2']['WORDS'], node_size=demo_data['TOPIC2']['WORDS'].values())
nx.draw(G,with_labels=True)

但是节点大小不起作用,位置也不符合我的要求。也很难弄清楚如何以编程方式在现有节点之间添加边。

您提供的node_size是节点本身的一个属性。它不会影响它的绘制方式。

绘制节点的大小需要作为listnx.draw函数中传递。默认节点大小为 300.

这样做的一种方法是这样的:

demo_data = {"TOPIC1": {"SIZE": 50, 
                        "WORDS": {"cat": 20, "dog": 30}}, 
             "TOPIC2": {"SIZE": 25, 
                        "WORDS": {"bat": 4, "rat": 9}}}

for key in demo_data.keys():
  G.add_node(key, size=demo_data[key]["SIZE"] * 10)
  for animal, size in demo_data[key]["WORDS"].items():
    G.add_node(animal, size=size*10)
    G.add_edge(animal, key)