首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为网络中的不同节点分配不同的颜色?

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

Stack Overflow用户
提问于 2020-11-21 11:25:47
回答 2查看 208关注 0票数 1

我尝试了所有我能在网上找到的东西,但仍然找不到。我的目标是使用matplotlib/networkx根据节点的标识符对节点进行明显的着色。

所以我现在有了我的图的边和节点(下面是每个边和节点的一小段):

代码语言:javascript
运行
复制
sub_interactome.edges = [('P30876', 'P36954'), ('P30876', 'P19387'), ('P41136', 'Q60722'), ('P41136', 'P17433')]

sub_interactome.nodes = ['P30876', 'P36954', 'P41136', 'Q60722', 'P30876', 'P19387','P17433']

我正在尝试为我的结束图的每个节点设置不同的颜色。到目前为止,这是我写的代码,但我确信我离得很远。这部分让我了解网络本身。

代码语言:javascript
运行
复制
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个节点,所以仅仅为每个节点输入颜色显然是行不通的。我试着用网上可以找到的各种方法创建一个色彩映射表,但没有成功。然后,我将其全部转换为字典,以尝试以这种方式映射颜色映射:

代码语言:javascript
运行
复制
def Convert(tup, di): 
    for a, b in tup: 
        di.setdefault(a, [] ).append(b) 
    return di 
dictionary = {}
keyvalinteractome = Convert(sub_interactome.edges,dictionary)

这使我成为了一个字典,但我仍然不能想出一种适当的方法来为每个节点着色。我可能不需要这个,因为我可以使用.nodes创建一个节点列表,但我认为它可能在某种程度上有所帮助。我最近一次尝试为这些创建颜色映射,如下所示:

代码语言:javascript
运行
复制
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个小时了。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-21 11:41:09

如果我没记错的话,你正在寻找某种颜色生成器。我也经历过类似的挑战,而且我还面临着挑选最具对比度的颜色的挑战。

下面的代码对你来说应该很好,它使用HSV颜色技术,并从360度色调色柱中选择颜色:

代码语言:javascript
运行
复制
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

这段代码返回一个与传递给它的node_list长度相同的颜色数组。

票数 0
EN

Stack Overflow用户

发布于 2020-11-21 11:44:52

将for循环替换为:

代码语言:javascript
运行
复制
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)    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64939523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档