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

python igraph:节点和边根据与节点关联的数字着色,python,igraph,Python,Igraph,我对python和igraph非常陌生,所以这个问题可能非常简单 我有一个128个节点的网络和一个128个数字的数组,每个数字在0到1之间。数字表示节点的一个特征 我想要两件事: 如果array[i]==array[j] 必须根据以下标准给出i和j之间边缘的颜色: 如果数组[i]颜色\u边[ij]=颜色\u节点[i] else color_edge[ij]=color_node[j] 我尝试了很多东西,我认为主要的问题是: g.vs[i][“color”]=number不起作用。我必须插入

我对python和igraph非常陌生,所以这个问题可能非常简单

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

我想要两件事:

  • 如果
    array[i]==array[j]
  • 必须根据以下标准给出
    i
    j
    之间边缘的颜色:
    
    如果数组[i]颜色\u边[ij]=颜色\u节点[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][“颜色”]=“红色”
.
.
.
g、 vs[127][“颜色”]=“蓝色”

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

关于第二个问题,我试图使代码适应我的情况,但我得到的最好结果是两种不同的颜色(而且我不明白它们是如何“选择的两种颜色”)

我怎样才能解决这个问题

我知道我问了两个问题,但我认为它们非常相关。但是,如果有必要,我可以编辑这篇文章并创建一个新的


提前感谢。

制作一本与每个差异相关的颜色词典。不清楚您需要多少颜色,但为每个差异指定颜色名称“红色”或颜色代码“#FFFFFF”。比如说,

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

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

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

要获得相同颜色的节点
i
j
如果
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]
用于graph.es中的边:
u、 v=edge.tuple

边[“颜色”]=颜色[u]如果数组[u]我需要128种颜色。但如果我有一个更大的网络,我需要更多。一般来说,我需要每个节点一种颜色。这种方法与我链接的方法非常相似,并且存在一个问题,即我必须手动为每个差异分配一种颜色。假设节点的数量大约为10^5或更多。你会同意我的看法,即这种方法是可行的不可行…@Ludwik你能关闭这个问题并将这个答案标记为问题的解决方案吗?我没有这种能力,但是如果答案仅仅由外部链接组成,那么StackOverflow是不受欢迎的。目标页面随时可能消失。你应该总结解决方案并将链接作为源。