【发布时间】:2020-12-11 20:20:38
【问题描述】:
我在这里发布了对另一个 stackoverflow 帖子的评论/回复:R: Understanding Graph 与 R 中的图形有关。
如果你创建一些与电影和演员对应的数据(其中电影不能直接连接到其他电影,演员不能直接连接到其他演员),你写一些 R 代码来检查你的图是否是二分图:
library(igraph)
film_data <- data.frame(
"movie" = c("movie_1", "movie_1", "movie_1", "movie_2", "movie_2", "movie_2", "movie_3", "movie_3", "movie_3", "movie_4", "movie_4", "movie_4", "movie_4", "movie_5", "movie_5", "movie_5", "movie_6", "movie_6"),
"actor" = c("actor_1", "actor_2", "actor_3", "actor_2", "actor_3", "actor_4", "actor_1", "actor_5", "actor_6", "actor_2", "actor_7", "actor_1", "actor_8", "actor_5", "actor_9", "actor_3", "actor_2", "actor_8")
)
#create directed graph
graph <- graph.data.frame(film_data, directed=F)
graph <- simplify(graph)
plot(graph)
V(graph)$type <- V(graph)$name %in% film_data[,1]
is.bipartite(graph)
[1] TRUE
但是,您可以通过在两个参与者(actor_2 和 actor_3)之间添加链接来“故意破坏”该图,从而使该图不再是二分图:
film_data <- data.frame(
"movie" = c("movie_1", "movie_1", "movie_1", "movie_2", "movie_2", "movie_2", "movie_3", "movie_3", "movie_3", "movie_4", "movie_4", "movie_4", "movie_4", "movie_5", "movie_5", "movie_5", "movie_6", "movie_6", "actor_2"),
"actor" = c("actor_1", "actor_2", "actor_3", "actor_2", "actor_3", "actor_4", "actor_1", "actor_5", "actor_6", "actor_2", "actor_7", "actor_1", "actor_8", "actor_5", "actor_9", "actor_3", "actor_2", "actor_8", "actor_3")
)
#create directed graph
graph <- graph.data.frame(film_data, directed=F)
graph <- simplify(graph)
plot(graph)
但是 R 仍然会说这个图是二分的:
V(graph)$type <- V(graph)$name %in% film_data[,1]
is.bipartite(graph)
[1] TRUE
您可以通过在两部电影之间添加额外链接来进一步破坏此图表:
film_data <- data.frame(
"movie" = c("movie_1", "movie_1", "movie_1", "movie_2", "movie_2", "movie_2", "movie_3", "movie_3", "movie_3", "movie_4", "movie_4", "movie_4", "movie_4", "movie_5", "movie_5", "movie_5", "movie_6", "movie_6", "actor_2", "movie_1"),
"actor" = c("actor_1", "actor_2", "actor_3", "actor_2", "actor_3", "actor_4", "actor_1", "actor_5", "actor_6", "actor_2", "actor_7", "actor_1", "actor_8", "actor_5", "actor_9", "actor_3", "actor_2", "actor_8", "actor_3", "movie_2")
)
#create directed graph
graph <- graph.data.frame(film_data, directed=F)
graph <- simplify(graph)
plot(graph)
但 R 仍将其称为二分:
V(graph)$type <- V(graph)$name %in% film_data[,1]
is.bipartite(graph)
[1] TRUE
有谁知道我做错了什么?最后两张图实际上是二分的吗?还是我错误地应用了代码?
澄清一下:所有无向图都是循环的吗?如果你有一个只有一种节点的无向图,它一定是二分的?
谢谢
【问题讨论】:
-
改用
bipartite_mapping(graph) -
哇,指挥棒!澄清一下, bipartite_mapping() 是否要求您首先确定每个顶点所属的类型?例如V(graph)$type
-
@MrFlick:所有无向图都是循环的吗?如果你有一个只有一种类型节点的无向图,它一定是二分的?
-
@Noob 如果图包含一个循环,则它是循环的。这与它是定向还是非定向无关。
标签: r graph data-visualization nodes