Edited at

igraphのオブジェクト同士を2つ以上足すと、色情報が消える

igraphで多重グラフを描きたくて苦戦中に気づいたこと。

まず、ノードA、B、Cをもつグラフgがあったとする。

library("igraph")

g <- make_empty_graph()
g <- g + vertices(c("A", "B", "C"))

このオブジェクトに、後からtmpg1やtmpg2といった、別のオブジェクトを足し合わせていくことで、異なる色のエッジを持つ多重グラフが描けるのではと期待していた。

どういうことかと言うと、例えば、ここでは、tmpg1はA->B、B->C、tmpg2はA->B、A->C、B->Bというエッジを各々持っており、各々のエッジは赤と青だとする。

tmpg1 <- g

# Set the edge color as red
tmpg1 <- tmpg1 + edges(c("A", "B", "B", "C"), directed=TRUE)
tmpg1 <- set_edge_attr(tmpg1, name="color", value="red")

tmpg2 <- g
# Set the edge color as blue
tmpg2 <- tmpg2 + edges(c("A", "B", "A", "C", "B", "B"), directed=TRUE)
tmpg2 <- set_edge_attr(tmpg2, name="color", value="blue")

g自体には、エッジがないのでこのような図だが、

plot(g, vertex.size=40,

layout=layout_in_circle(g, order=1:3))

スクリーンショット 2019-06-21 18.36.54.png

tmpg1には赤いエッジが、

plot(g + tmpg1, vertex.size=40,

layout=layout_in_circle(g, order=1:3))

スクリーンショット 2019-06-21 18.37.08.png

tmpg2には青いエッジがあるので、

plot(g + tmpg2, vertex.size=40,

layout=layout_in_circle(g, order=1:3))

スクリーンショット 2019-06-21 18.37.24.png

これらを足しあわせたら、うまいこと、赤と青のエッジが共存したり、または赤と青が混じって紫のエッジが出てきたりすることを期待していたのだが、正解は、

plot(g + tmpg1 + tmpg2, vertex.size=40,

layout=layout_in_circle(g, order=1:3))

スクリーンショット 2019-06-21 18.37.42.png

グレーだった。

igraphオブジェクト同士の足し算で、エッジのカラー属性が受け継がれるのは知っていたが、2つ以上足すと、NULLになるらしい

E(g)$color

# NULL
E(tmpg1)$color
# "red" "red"
E(tmpg2)$color
# "blue" "blue" "blue" "blue" "blue"
E(g + tmpg1)$color
# "red" "red"
E(g + tmpg2)$color
# "blue" "blue" "blue" "blue" "blue"
E(g + tmpg1 + tmpg2)$color
# NULL

multigraphとか使ったほうがいいかもしれない