繁体   English   中英

python igraph:节点和边缘颜色根据与节点关联的数字

[英]python igraph: nodes and edges color according to a number associated to the node

我是python和igraph的新手,所以问题可能很简单。

我有一个128个节点的网络和128个数字的数组,每个数字在0和1之间。数字代表节点的一个特征。

我想要两件事:

  • 如果array[i] == array[j] ,节点ij的颜色必须相同
  • ij之间的边缘的颜色必须根据这个标准给出: if array[i]<=array[j] -> color_edge[ij] = color_node[i] else color_edge[ij] = color_node[j]

我尝试了很多东西,我认为主要的问题是:

  • g.vs[i]["color"] = number不起作用。我必须插入“red”或“HTML notation for color”字符串。 但是如何将我的数组的每个数字与一个字符串相关联?
  • g.es["color"]为所有链接指定颜色。 但是g.es[i]["color"]不起作用(这里g是我的图形,在g.es[i][".."]i是边缘的ID)。

关于第一个问题,我可以提出的唯一解决方案是手动为每个节点分配颜色

g.vs[0]["color"] = "red" . . . g.vs[127]["color"] = "blue"

然后检查array上的条件并最终改变两个节点之一的颜色( g.vs[i]["color"] = g.vs[j]["color"] )。 但这是一个巨大的时间损失,并不是一般的方法(如果网络有10 ^ 6个节点怎么办?)。 这里有人建议我

关于第二个问题,我试着在这里调整代码到我的案例,但我得到的最好的是两种不同的颜色(而且我不明白他们是如何“选择两个”)

我怎么解决这个问题?

我知道我问过两个问题,但我认为它们非常相关。 但是,如有必要,我可以编辑此帖子并创建一个新帖子。

提前致谢。

我在igrpah邮件列表上问了这个问题。

要获得相同颜色的节点ij如果array[i] == array[j]您可以这样做:

id_gen = UniqueIdGenerator()
color_indices = [id_gen.add(value) for value in array]
palette = ClusterColoringPalette(len(id_gen))
colors = [palette[index] for index in color_indices]
graph.vs["color"] = colors 

要获得边缘的颜色,可以通过问题中的标准来确定

for edge in graph.es:
u, v = edge.tuple
  edge["color"] = colors[u if array[u] <= array[v] else v]

我从邮件列表收到的完整答案就在这里

制作与每种差异相关的颜色字典。 目前尚不清楚您需要多少种颜色,但为每个差异指定颜色名称“红色”或颜色代码“#FFFFFF”。 例如,

coldict = {}
coldict[0] = "red"

因此,当您检查差异数组[i] - 数组[j] = 0时,它会指定红色。 对所有预期的差异执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM