如何为网络中的不同节点分配不同的颜色?
How can I assign different colors to different nodes in my network?
我尝试了所有我能在网上找到的东西,但仍然不够用。我的目标是使用 matplotlib/networkx 根据标识符对节点进行不同的着色。
所以我目前有我的图的边和节点(这里是每个的一小段):
sub_interactome.edges = [('P30876', 'P36954'), ('P30876', 'P19387'), ('P41136', 'Q60722'), ('P41136', 'P17433')]
sub_interactome.nodes = ['P30876', 'P36954', 'P41136', 'Q60722', 'P30876', 'P19387','P17433']
我正在尝试为我的最终图表的每个节点制作不同的颜色。到目前为止,这是我制作的代码,但我确信我还差得远。这部分让我了解网络本身。
plt.figure(figsize=(10,10))
nx.spring_layout(sub_interactome)
nx.draw_networkx(sub_interactome, with_labels=True)
col.Colormap(valid_uniprots, len(valid_uniprots))
plt.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False)
plt.tick_params(axis='y', which='both', right=False, left=False, labelleft=False)
for ty in ['right','top','bottom','left']:
plt.gca().spines[ty].set_visible(False)
plt.show()
我总共有 239 个节点,所以只为每个节点输入一种颜色显然是行不通的。我尝试使用可以在网上找到的各种方法创建颜色图,但没有用。然后我把它全部变成一个字典来尝试以这种方式映射颜色图:
def Convert(tup, di):
for a, b in tup:
di.setdefault(a, [] ).append(b)
return di
dictionary = {}
keyvalinteractome = Convert(sub_interactome.edges,dictionary)
这使我成为了一本字典,但我仍然想不出为每个节点着色的正确方法。我可能不需要这个,因为我可以使用 .nodes 创建一个节点列表,但我认为它可能会以某种方式提供帮助。我最近为这些创建颜色图的尝试如下:
G = sub_interactome
n_colors = len(keyvalinteractome.keys())
pos = nx.spring_layout(G)
for key in G.nodes():
nx.draw_networkx_nodes(G,pos,[m for m in G.nodes() if keyvalinteractome[m]==key],node_color=['red','blue','green','yellow','purple'])
nx.draw_networkx_edges(G,pos)
这样,我仍然必须输入无法正常工作的颜色,而且它仍然给我一个错误。
如果有人能帮我解决这个问题,我将不胜感激,我是 python 的新手,正在努力学习,但我已经尝试完成这一期大约 5 个小时了。
提前致谢!
如果我没记错的话,您正在寻找某种颜色生成器。我经历过类似的挑战,而且我还面临着选择最对比色的挑战。
下面这段代码应该适合你,它使用 HSV 颜色技术并从 360 度 Hue 颜色柱体中选择颜色:
import numpy as np, colorsys
def choose_colors(node_list):
num_colors = len(node_list)
colors=[]
for i in np.arange(0., 360., 360. / num_colors):
hue = i/360.
lightness = (30 + np.random.rand() * 70)/100.0
saturation = (30 + np.random.rand() * 70)/100.0
colors.append(colorsys.hls_to_rgb(hue, lightness, saturation))
return colors
此代码段 returns 颜色数组与传递给它的 node_list 的长度相同。
将您的 for 循环替换为:
color_list=['red','blue','green','yellow','purple']
for ind, key in enumerate(G.nodes()):
nx.draw_networkx_nodes(G,pos,node_color=color_list[ind % 5])
nx.draw_networkx_edges(G,pos)
我尝试了所有我能在网上找到的东西,但仍然不够用。我的目标是使用 matplotlib/networkx 根据标识符对节点进行不同的着色。
所以我目前有我的图的边和节点(这里是每个的一小段):
sub_interactome.edges = [('P30876', 'P36954'), ('P30876', 'P19387'), ('P41136', 'Q60722'), ('P41136', 'P17433')]
sub_interactome.nodes = ['P30876', 'P36954', 'P41136', 'Q60722', 'P30876', 'P19387','P17433']
我正在尝试为我的最终图表的每个节点制作不同的颜色。到目前为止,这是我制作的代码,但我确信我还差得远。这部分让我了解网络本身。
plt.figure(figsize=(10,10))
nx.spring_layout(sub_interactome)
nx.draw_networkx(sub_interactome, with_labels=True)
col.Colormap(valid_uniprots, len(valid_uniprots))
plt.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False)
plt.tick_params(axis='y', which='both', right=False, left=False, labelleft=False)
for ty in ['right','top','bottom','left']:
plt.gca().spines[ty].set_visible(False)
plt.show()
我总共有 239 个节点,所以只为每个节点输入一种颜色显然是行不通的。我尝试使用可以在网上找到的各种方法创建颜色图,但没有用。然后我把它全部变成一个字典来尝试以这种方式映射颜色图:
def Convert(tup, di):
for a, b in tup:
di.setdefault(a, [] ).append(b)
return di
dictionary = {}
keyvalinteractome = Convert(sub_interactome.edges,dictionary)
这使我成为了一本字典,但我仍然想不出为每个节点着色的正确方法。我可能不需要这个,因为我可以使用 .nodes 创建一个节点列表,但我认为它可能会以某种方式提供帮助。我最近为这些创建颜色图的尝试如下:
G = sub_interactome
n_colors = len(keyvalinteractome.keys())
pos = nx.spring_layout(G)
for key in G.nodes():
nx.draw_networkx_nodes(G,pos,[m for m in G.nodes() if keyvalinteractome[m]==key],node_color=['red','blue','green','yellow','purple'])
nx.draw_networkx_edges(G,pos)
这样,我仍然必须输入无法正常工作的颜色,而且它仍然给我一个错误。
如果有人能帮我解决这个问题,我将不胜感激,我是 python 的新手,正在努力学习,但我已经尝试完成这一期大约 5 个小时了。
提前致谢!
如果我没记错的话,您正在寻找某种颜色生成器。我经历过类似的挑战,而且我还面临着选择最对比色的挑战。
下面这段代码应该适合你,它使用 HSV 颜色技术并从 360 度 Hue 颜色柱体中选择颜色:
import numpy as np, colorsys
def choose_colors(node_list):
num_colors = len(node_list)
colors=[]
for i in np.arange(0., 360., 360. / num_colors):
hue = i/360.
lightness = (30 + np.random.rand() * 70)/100.0
saturation = (30 + np.random.rand() * 70)/100.0
colors.append(colorsys.hls_to_rgb(hue, lightness, saturation))
return colors
此代码段 returns 颜色数组与传递给它的 node_list 的长度相同。
将您的 for 循环替换为:
color_list=['red','blue','green','yellow','purple']
for ind, key in enumerate(G.nodes()):
nx.draw_networkx_nodes(G,pos,node_color=color_list[ind % 5])
nx.draw_networkx_edges(G,pos)