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

时间:2017-05-20 14:17:00

标签: python igraph

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

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

我想要两件事:

  • 如果i
  • ,节点jarray[i] == array[j]的颜色必须相同
  • 必须根据以下标准给出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个节点怎么办?)。我在这个here

中被建议了

关于第二个问题,我尝试将here中的代码改编为我的案例,但我获得的最好的是两种不同的颜色(而且我不明白他们是如何“选择两个”)< / p>

我该如何解决这个问题?

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

我在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]

我从邮件列表中收到的完整答案是here

答案 1 :(得分:0)

制作与每种差异相关的颜色词典。不清楚你需要多少种颜色,但要指定一个颜色名称&#34;红色&#34;或颜色代码&#34; #FFFFFF&#34;每个差异。例如,

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

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