python igraph:节点和边的颜色根据与节点关联的数字
python igraph: nodes and edges color according to a number associated to the node
我是 python 和 igraph 的新手,所以这个问题可能真的很简单。
我有一个包含 128 个节点和 128 个数字数组的网络,每个数字都在 0 和 1 之间。数字代表节点的一个特征。
我想要两件事:
- 节点
i
和 j
的颜色必须相同,如果 array[i] == array[j]
i
和j
之间的边的颜色必须根据这个标准给出:
if array[i]<=array[j] -> color_edge[ij] = color_node[i]
else color_edge[ij] = color_node[j]
我尝试了很多东西,我认为主要问题是:
g.vs[i]["color"] = number
不必 work.I 插入 "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 中的代码,但我得到的最好的是两种不同的颜色(而且我不明白它们是如何 "the choosen two" )
我该如何解决这个问题?
P.s。我知道我问了两个问题,但我认为它们非常相关。但是,如有必要,我可以编辑此 post 并创建一个新的。
提前致谢。
制作一个与每个差异相关的颜色字典。不清楚您需要多少种颜色,但请为每个差异分配一个颜色名称 "red" 或颜色代码“#FFFFFF”。例如,
coldict = {}
coldict[0] = "red"
因此,当您检查数组[i] - 数组[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]
我从邮件列表收到的完整答复是here。
我是 python 和 igraph 的新手,所以这个问题可能真的很简单。
我有一个包含 128 个节点和 128 个数字数组的网络,每个数字都在 0 和 1 之间。数字代表节点的一个特征。
我想要两件事:
- 节点
i
和j
的颜色必须相同,如果array[i] == array[j]
i
和j
之间的边的颜色必须根据这个标准给出:if array[i]<=array[j] -> color_edge[ij] = color_node[i] else color_edge[ij] = color_node[j]
我尝试了很多东西,我认为主要问题是:
g.vs[i]["color"] = number
不必 work.I 插入 "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 中的代码,但我得到的最好的是两种不同的颜色(而且我不明白它们是如何 "the choosen two" )
我该如何解决这个问题?
P.s。我知道我问了两个问题,但我认为它们非常相关。但是,如有必要,我可以编辑此 post 并创建一个新的。
提前致谢。
制作一个与每个差异相关的颜色字典。不清楚您需要多少种颜色,但请为每个差异分配一个颜色名称 "red" 或颜色代码“#FFFFFF”。例如,
coldict = {}
coldict[0] = "red"
因此,当您检查数组[i] - 数组[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]
我从邮件列表收到的完整答复是here。