如何为网络中的不同节点分配不同的颜色?

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)