如何为networkx中的不同节点组分配不同的颜色图

how to assign different color map for different group of nodes in networkx

我正在尝试使用 python3 networkx 模块绘制网络。 具体就是给节点赋色的工作,还没有考虑画边

示例网络由三组('EU'、'NA'、'AS')组成,每组有 2 或 3 个元素,如下所示。

EU : ['UK', 'FR', 'GE'] <---- 节点颜色:红色

NA : ['US', 'CA'] <---- 节点颜色:蓝色

AS : ['JP', 'CN', IN'] <---- 节点颜色:绿色

我为每组节点设置了不同的绘图布局并分配了不同的颜色,并根据它们的 'landsize' 属性绘制了不同大小的节点。我附上了我画的图片。

但是,我想为每个组分配颜色图而不是纯色。

例如,对于欧盟,分配的不是红色而是plt.cm.Reds,对于北美,分配plt.cm.Blues。

(在这种情况下颜色图范围基于节点的大小。)

有没有办法为不同的节点组分配不同的颜色图?

感谢阅读。

import networkx as nx

G = nx.Graph()
G.add_nodes_from([
    ('UK', {'reg' : 'EU', 'color' : 'red', 'landsize' : 241}),
    ('FR', {'reg' : 'EU', 'color' : 'red', 'landsize' : 547}),
    ('GE', {'reg' : 'EU', 'color' : 'red', 'landsize' : 348}),
    ('US', {'reg' : 'NA', 'color' : 'blue', 'landsize' : 9147}),
    ('CA', {'reg' : 'NA', 'color' : 'blue', 'landsize' : 9093}),
    ('JP', {'reg' : 'AS', 'color' : 'green', 'landsize' : 364}),
    ('CN', {'reg' : 'AS', 'color' : 'green', 'landsize' : 9388}),
    ('IN', {'reg' : 'AS', 'color' : 'green', 'landsize' : 2973})
    ])

eu_pos = nx.spring_layout(G.subgraph(['UK','FR','GE']), k =0.01)
na_pos = nx.random_layout(G.subgraph(['US','CA']))
as_pos = nx.kamada_kawai_layout(G.subgraph(['JP','CN','IN']))

my_pos = {i : nx.spring_layout(G.subgraph([node for node, attr in G.nodes(data = 'reg') if attr == i])) for i in ['EU','NA','AS']}

new_pos = {}

new_pos.update({node : (pos[0], pos[1]) for node, pos in my_pos['EU'].items()})
new_pos.update({node : (pos[0], pos[1]) for node, pos in my_pos['NA'].items()})
new_pos.update({node : (pos[0], pos[1]) for node, pos in my_pos['AS'].items()})


nx.draw_networkx_nodes(G, new_pos, node_size =  [c for n,c in G.nodes(data='landsize')], node_color = [c for n,c in G.nodes(data='color')])
nx.draw_networkx_labels(G, new_pos, font_color = 'white')

您只需多次调用 nx.draw_networkx_nodes。 在每次调用中,您绘制一个区域(使用相应的颜色图)。我很自由 select “绿色” 为 “AS”。

import networkx as nx
import matplotlib.pylab as pl

G = nx.Graph()
G.add_nodes_from([
    ('UK', {'reg': 'EU', 'color': 'red', 'landsize': 241}),
    ('FR', {'reg': 'EU', 'color': 'red', 'landsize': 547}),
    ('GE', {'reg': 'EU', 'color': 'red', 'landsize': 348}),
    ('US', {'reg': 'NA', 'color': 'blue', 'landsize': 9147}),
    ('CA', {'reg': 'NA', 'color': 'blue', 'landsize': 9093}),
    ('JP', {'reg': 'AS', 'color': 'green', 'landsize': 364}),
    ('CN', {'reg': 'AS', 'color': 'green', 'landsize': 9388}),
    ('IN', {'reg': 'AS', 'color': 'green', 'landsize': 2973})
])

eu_pos = nx.spring_layout(G.subgraph(['UK', 'FR', 'GE']), k=0.01)
na_pos = nx.random_layout(G.subgraph(['US', 'CA']))
as_pos = nx.kamada_kawai_layout(G.subgraph(['JP', 'CN', 'IN']))

my_pos = {i: nx.spring_layout(G.subgraph([node for node, attr in G.nodes(data='reg') if attr == i])) for i in
          ['EU', 'NA', 'AS']}

new_pos = {}

new_pos.update({node: (pos[0], pos[1]) for node, pos in my_pos['EU'].items()})
new_pos.update({node: (pos[0], pos[1]) for node, pos in my_pos['NA'].items()})
new_pos.update({node: (pos[0], pos[1]) for node, pos in my_pos['AS'].items()})

for group, colormap in [("EU", "Reds"), ("NA", "Blues"), ("AS", "Greens")]:
    nodelist = [node for node in G if G.nodes[node]["reg"] == group]
    node_sizes = [G.nodes[node]["landsize"] for node in nodelist]
    nx.draw_networkx_nodes(G,
                           new_pos,
                           node_color=node_sizes,
                           nodelist=nodelist,
                           node_size=node_sizes,
                           cmap=pl.get_cmap(colormap))
nx.draw_networkx_labels(G, new_pos, font_color='white')
pl.show()