【问题标题】:R: Modifying GraphsR:修改图表
【发布时间】: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


【解决方案1】:

确实,您创建的图不是二分图:“演员”部分有相邻的顶点。

函数is.bipartite()(或其名称)具有高度误导性。它只告诉您图形是否具有称为类型的所需顶点属性。它不检查构成图二分的其他特征。来源:?is.bipartite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2021-11-02
    • 2015-07-02
    • 2023-04-03
    • 2019-01-07
    相关资源
    最近更新 更多