代码之家  ›  专栏  ›  技术社区  ›  s__

R:如何控制图形中边的行为

  •  2
  • s__  · 技术社区  · 6 年前

    我面临着这个问题:我得到了如下数据:

    library(tidyverse)
    library(tidygraph)
    library(ggraph)
    library(ggrepel)
    
    edges <- data.frame(a=c('k','k','k','k','k','z','z'),
                        b=c('b','b','b','b','c','b','c'), costant = 1)
      a b costant
    1 k b       1
    2 k b       1
    3 k b       1
    4 k b       1
    5 k c       1
    6 z b       1
    7 z c       1
    

    现在我想要一个带有ggraph的图,它有节点和边,还有权重。所以我这样做:

    # first I calculated the edges weights
    edges1 <- edges%>% group_by(a,b) %>% summarise(weight = sum(costant))
    > edges1
    # A tibble: 4 x 3
    # Groups:   a [?]
      a     b     weight
      <fct> <fct>  <dbl>
    1 k     b          4
    2 k     c          1
    3 z     b          1
    4 z     c          1
    

    然后是节点:

    nodes <- rbind(data.frame(word = edges$a, n = 1),data.frame(word = edges$b, n = 1)) %>%
     group_by(word) %>%
    summarise(n = sum(n))
    > nodes
    # A tibble: 4 x 2
      word      n
      <fct> <dbl>
    1 k         5
    2 z         2
    3 b         5
    4 c         2
    

    到现在为止,一切正常。现在,跟随 this 例如:

    tidy <- tbl_graph(nodes = nodes, edges = edges1, directed = T)
    tidy <- tidy %>% 
      activate(edges) %>% 
      arrange(desc(weight)
    )
    

    ggraph(tidy, layout = "gem") + 
      geom_node_point(aes(size=n)) +
      geom_edge_link(aes(width = weight), alpha = 0.8) + 
      scale_edge_width(range = c(0.2, 2)) +
      geom_text_repel(aes(x = x, y=y , label=word)) 
    

    但结果是:

    enter image description here

    我不明白为什么在k和z之间有一条线,因为边不存在。

    提前谢谢。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Sandipan Dey    6 年前

    似乎是因为 tbl_graph edge1 tibble的节点来自 factor integer 通过 as.integer 不考虑 nodes

    edges <- data.frame(a=c('k','k','k','k','k','z','z'),
                        b=c('b','b','b','b','c','b','c'), costant = 1)
    edges1 <- edges%>% group_by(a,b) %>% summarise(weight = sum(costant))
    
    nodes <- rbind(data.frame(word = edges$a, n = 1),data.frame(word = edges$b, n = 1)) %>%
      group_by(word) %>%
      summarise(n = sum(n))
    
    edges2 <- edges1 # save edges with factor node labels into edge2
    # convert 'from' and 'to' factor columns to integer columns correctly 
    # with the nodes tibble's corresponding matched index values 
    edges1$a <- match(edges1$a, nodes$word) 
    edges1$b <- match(edges1$b, nodes$word)
    
    tidy <- tbl_graph(nodes = nodes, edges = edges1, directed = T)
    tidy <- tidy %>% 
      activate(edges) %>% 
      arrange(desc(weight)
      ) 
    
    ggraph(tidy, layout = "gem") + 
       geom_node_point(aes(size=n)) +
       geom_edge_link(aes(width = weight), arrow = arrow(length = unit(4, 'mm')), end_cap = circle(3, 'mm'), alpha = 0.8) + 
       scale_edge_width(range = c(0.2, 2)) +
       geom_text_repel(aes(x = x, y=y , label=word)) 
    
    edges2 # compare the edges in the following tibble with the next figure
    # A tibble: 4 x 3
    # Groups:   a [?]
        a     b     weight
      <fct> <fct>  <dbl>
    #1 k     b       4
    #2 k     c       1
    #3 z     b       1
    #4 z     c       1
    

    enter image description here

    推荐文章