如何为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()
我正在尝试使用 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()