【问题标题】:Drawing graph G=(V,E) in R在 R 中绘制图形 G=(V,E)
【发布时间】:2016-10-30 18:59:17
【问题描述】:

我想通过 ggplot 或一些 R 内置函数在 R 中绘制标准 G=(V,E) 图。

我有一个包含顶点坐标的数据框:

> V
      x        y
1  589.3438 6422.883
2 8762.6921 7789.147
3 7973.0883 4552.745
4 4100.8408 8108.702
5 6049.3329 6547.239

和一个表示边的零一对称矩阵:

> E
       [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    1    0
 [2,]    0    0    1    0    1
 [3,]    0    1    0    0    1
 [4,]    1    0    0    0    1
 [5,]    0    1    1    1    0

我使用以下方法绘制顶点:

plotGraph <- function() {
  qplot(x,
        y,
        data=V,
        xlim=c(0,SIZE),
        ylim=c(0,SIZE),
        main="Graph"
  )
}

如何在同一个图上绘制图形边缘?或者如何绘制从 (x1, y1) 到 (x2, y2) 的单边?

任何帮助将不胜感激。

【问题讨论】:

  • 你在函数中使用的变量SIZE是什么?
  • 这是一个定义整个问题范围的全局常量。坐标在 (0, SIZE) 范围内,我自然希望绘图输出包含(显示)所有顶点。

标签: r graph ggplot2


【解决方案1】:

编辑(2017 年 7 月 7 日):

由于我最初回答了这个问题,一个新的和改进的网络/图形绘图包,ggraph,已经发布,我认为它应该取代下面的选项,所以我正在编辑我的答案以添加 @ 987654329@选项:

首先,将顶点和边作为 igraph 图对象进行一些操作:

library(igraph)
library(tidyverse)
library(ggraph)

V <- read.table(text = "x        y
                        589.3438 6422.883
                        8762.6921 7789.147
                        7973.0883 4552.745
                        4100.8408 8108.702
                        6049.3329 6547.239", 
    header = T) %>%
  rownames_to_column("name")

E <- matrix(c(0,    0,    0,    1,    0,
              0,    0,    1,    0,    1,
              0,    1,    0,    0,    1,
              1,    0,    0,    0,    1,
              0,    1,    1,    1,    0), nrow = 5, byrow = T) %>%
  data.frame() %>% 
  rename_all(list(function(x) 1:5)) %>% 
  rownames_to_column(var = "from") %>% 
  gather(to, val, 2:6) %>% 
  filter(val == 1) %>%
  select(from, to)

g <- graph_from_data_frame(E, vertices = V, directed = F)

现在是ggraph 魔法。为了说明它的威力,我混合并匹配了各种边缘和节点geoms,以提供ggraph 的可能性示例。

ggraph(g) + 
  geom_edge_link() + 
  geom_node_label(aes(label = name))
#> Using `nicely` as default layout

ggraph(g) + 
  geom_edge_arc() + 
  geom_node_point()
#> Using `nicely` as default layout

ggraph(g) + 
  geom_edge_diagonal() + 
  geom_node_text(aes(label = name), color = "blue")
#> Using `nicely` as default layout


原答案:

如果使用igraph 是一个选项,我会推荐它。在处理图表时,它是一个非常有用的包。以下是我使用 igraph 的方法:

library(igraph)

# convert V to a matrix and E to a graph
V <- data.matrix(V)
g <- graph_from_adjacency_matrix(E, mode="undirected")

plot.igraph(g, layout = V)

或者,如果您想要一个 ggplot 风格的方法,您可以使用 GGally 包中的 ggnet2

library(GGally)

V <- data.matrix(V)
# with ggnet2 you don't have to convert E to a graph

ggnet2(net = E, mode = V ) 

【讨论】:

  • 太完美了!非常感谢。顺便说一句,第一个代码 sn-p 几乎没有错字,应该是:g &lt;- graph_from_adjacency_matrix( ... )
  • @yeedle 这是一个非常详细的答案。谢谢你。我正在尝试在您的第一个答案中将节点类型更改为圆形。我试过 geom_node_circle() 但它给出了一个错误。您能告诉我如何更改节点类型和颜色设置以及边缘宽度吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多