【问题标题】:Adding Text to an igraph in R将文本添加到 R 中的 igraph
【发布时间】:2021-12-05 19:57:47
【问题描述】:

我有以下代码,感谢answer by @G.Grothendieck

library(igraph)

DF <- data.frame(in. = 1:6, out. = c(3, 3, 5, 5, 7, 7)) 

g <- graph_from_edgelist(as.matrix(DF[2:1]))
lay <- layout_as_tree(g)
plot(as.undirected(g), layout = lay %*% diag(c(1, -1)))

现在,我需要在此绘图中添加一些文本:

DF <- data.frame(in. = 1:6, out. = c(3, 3, 5, 5, 7, 7), 
date = c('2019-11-01', '2019-11-01', '2020-01-01',  '2020-01-01', '2020-12-31', '2020-12-31') ) 

我希望 2019-11-01 显示在顶层的一侧(或者更好的是,在每个级别的两个节点之间),然后 2020-01-01 显示在下一层,'2020 -12-31` 在下一个,底层什么都没有。

这可能吗?

【问题讨论】:

  • 为什么不标注边缘?什么是预期的输出?试试看:g &lt;- graph_from_data_frame(DF); plot(as.undirected(g), layout = lay %*% diag(c(1, -1)), edge.label = DF$date)

标签: r igraph


【解决方案1】:

我希望我理解正确。您可以只添加带有坐标的文本。例如,坐标 0,0 将文本放在中间。您可以将任何文本定位到任何位置。

g <- graph_from_edgelist(as.matrix(DF[2:1]))
lay <- layout_as_tree(g)
plot(as.undirected(g), layout = lay %*% diag(c(1, -1)))
text(lay[1,1], (lay[1,2]+lay[3,2]/2),"2019-11-01")

【讨论】:

  • 很高兴知道,谢谢,但我担心以编程方式执行此操作,因为树可能非常大或非常小
  • 从对象“lay”中可以提取每个节点的坐标。您可以制作一个公式来垂直生成节点之间的位置。如果我理解,您希望它位于节点 1 和节点 3 之间,因此找到节点 1 的 x 坐标以及节点 1 和节点 3 之间的 y 坐标的平均值。
  • 我更新了答案。因此,坐标基于节点的确切位置。如果你有更大的情节,我建议创建一个函数。
【解决方案2】:

您可以将date 作为属性添加到图形对象g,还可以绘制有向图g,但带有不可见的箭头,例如edge.arrow.size = 0

g <- graph_from_data_frame(cbind(rev(DF), date))
lay <- layout_as_tree(g)
plot(g, layout = lay %*% diag(c(1, -1)), edge.label = E(g)$date, edge.arrow.size = 0)

【讨论】:

  • (+1) 这看起来很不错,但它给了我一个错误:DF &lt;- data.frame(in. = 1:6, out. = c(3, 3, 5, 5, 7, 7), date = c('2019-11-01', '2019-11-01', '2020-01-01', '2020-01-01', '2020-12-31', '2020-12-31') ) ; g &lt;- graph_from_data_frame(cbind(rev(DF), date))Error in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class ""function"" to a data.frame
  • @JoeKing 在您的代码中,您已经将date 添加到DF,那么您应该直接使用graph_from_data_frame(DF)
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 2012-01-26
  • 2021-07-07
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多