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))
tmpg1には赤いエッジが、
plot(g + tmpg1, vertex.size=40,
layout=layout_in_circle(g, order=1:3))
tmpg2には青いエッジがあるので、
plot(g + tmpg2, vertex.size=40,
layout=layout_in_circle(g, order=1:3))
これらを足しあわせたら、うまいこと、赤と青のエッジが共存したり、または赤と青が混じって紫のエッジが出てきたりすることを期待していたのだが、正解は、
plot(g + tmpg1 + tmpg2, vertex.size=40,
layout=layout_in_circle(g, order=1:3))
グレーだった。
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とか使ったほうがいいかもしれない