【问题标题】:Creating a tree graph in igraph在 igraph 中创建树形图
【发布时间】:2015-10-01 08:03:44
【问题描述】:

我正在尝试在 igraph (R) 中创建一个家谱树,我使用了以下代码:

id = 1:5
parent = c(1,1,2,3,3)
name = c("A", "B", "C", "D", "E")
data = data.frame(id, parent, name)
n = graph.data.frame(data)
co=layout.reingold.tilford(n, flip.y=T)
plot <- plot.igraph(g,layout=co, vertex.label = name)

D 和 E 都应该有父 C,但是这段代码经常将 D 和 E 绘制在彼此之上,只有一个箭头(而不是两个)。有人有解决这个问题的办法吗?

【问题讨论】:

  • 清除你的工作区/重启R。最后一行使用的对象g在上面的代码中没有定义。我想应该是n。如果是这样,我觉得它是正确的。
  • 唉,这并不能解决问题。
  • 使用layout.reingold.tilford 来布局图表很重要吗?它是随机的,似乎有些不稳定。
  • 啊,也许这就是为什么..我认为没有必要,这只是我在其他人的代码中看到的。我去看看,谢谢..

标签: r tree igraph


【解决方案1】:

首先,您似乎错误地指定了data.frame 来获取您的图表。 data 的第一列和第二列分别指定了边运行fromto 的顶点。因此,要将 D 和 E 作为 C 的子级,您需要在第一列中有 parents。 其次,您只需直接指定标签/名称data.frame。 我得到了这个工作:

library("igraph")
data <- data.frame(parent = LETTERS[c(1,1,2,3,3)], id = LETTERS[1:5])
g <- graph.data.frame(data)

myformat <- function(g) {
  layout.reingold.tilford(g, root = 1, flip.y = FALSE, circular = FALSE)
}
plot(g, layout = myformat)

这是你想要的吗?

【讨论】:

    【解决方案2】:

    我在使用该绘图命令时也遇到了问题(不是交互式绘图方式),但从那时起我就开始使用tkplot (http://igraph.org/r/doc/tkplot.html)。

    检查这个版本:

    library(igraph)
    
    id = 1:5
    parent = c(1,1,2,3,3)
    name = c("A", "B", "C", "D", "E")
    data = data.frame(id, parent, name)
    g = graph.data.frame(data)
    tkplot(g, vertex.color="red", vertex.label=name)
    

    你应该得到类似的东西:

    您可以移动节点(拖动它们)、单击箭头、更改它们的颜色(所有或特定节点)等。非常适合可视化。当您处理非常大的图表时,您可能会发现一些问题。

    但要明确一点,您在代码中遇到的问题似乎是由 layout 命令造成的。如果你这样做:

    library(igraph)
    
    id = 1:5
    parent = c(1,1,2,3,3)
    name = c("A", "B", "C", "D", "E")
    data = data.frame(id, parent, name)
    g = graph.data.frame(data)
    plot <- plot.igraph(g,vertex.label = name)
    

    你应该得到:

    这与tkplot 完全相同,但它不允许您更改实际绘图上的形状或其他元素。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多