我尝试了所有我能在网上找到的东西,但仍然找不到。我的目标是使用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个小时了。
提前感谢!
发布于 2020-11-21 03:41:09
如果我没记错的话,你正在寻找某种颜色生成器。我也经历过类似的挑战,而且我还面临着挑选最具对比度的颜色的挑战。
下面的代码对你来说应该很好,它使用HSV颜色技术,并从360度色调色柱中选择颜色:
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长度相同的颜色数组。
发布于 2020-11-21 03:44:52
将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)
https://stackoverflow.com/questions/64939523
复制相似问题