11 min read

一文读懂 ggraph 的使用

ggraph 可用于 网络、图和树状 数据结构的可视化。它扩展了 ggplot2 的 geoms,facets 等功能,并且添加了对 layouts 语法的支持。

先看一个简单的例子。

library(ggraph)
## 载入需要的程辑包:ggplot2
library(tidygraph)
## 
## 载入程辑包:'tidygraph'
## The following object is masked from 'package:stats':
## 
##     filter
# Create graph of highschool friendships
graph <- as_tbl_graph(highschool) %>% 
    mutate(Popularity = centrality_degree(mode = 'in'))

这个数据(highschool)包含了学校成员之间的联系。第一列是一个人(from),第二列是另一个人(to),第三列是这个连接(edge)的属性。

highschool
##    from to year
## 1     1 14 1957
## 2     1 15 1957
## 3     1 21 1957
## 4     1 54 1957
## 5     1 55 1957
## 6     2 21 1957
## 7     2 22 1957
## 8     3  9 1957
## 9     3 15 1957
## 10    4  5 1957
## 11    4 18 1957
## 12    4 19 1957
## 13    4 43 1957
## 14    5 19 1957
## 15    5 43 1957
## 16    6 13 1957
## 17    6 20 1957
## 18    6 22 1957
## 19    7 17 1957
## 20    8 14 1957
## 21    8 17 1957
## 22    9 12 1957
## 23    9 20 1957
## 24    9 21 1957
## 25    9 22 1957
## 26    9 51 1957
## 27   11 19 1957
## 28   11 50 1957
## 29   11 52 1957
## 30   11 53 1957
## 31   12 20 1957
## 32   12 21 1957
## 33   12 22 1957
##  [ reached 'max' / getOption("max.print") -- omitted 473 rows ]

在生成图(graph)之后,计算了节点(node)的 centrality。

graph
## # A tbl_graph: 70 nodes and 506 edges
## #
## # A directed multigraph with 1 component
## #
## # Node Data: 70 x 2 (active)
##   name  Popularity
##   <chr>      <dbl>
## 1 1              2
## 2 2              0
## 3 3              0
## 4 4              4
## 5 5              5
## 6 6              2
## # ... with 64 more rows
## #
## # Edge Data: 506 x 3
##    from    to  year
##   <int> <int> <dbl>
## 1     1    13  1957
## 2     1    14  1957
## 3     1    20  1957
## # ... with 503 more rows

这样的一个 graph 含有 70 个节点,506 条边,是一个有向图(directed)。Node 的属性 Popularity 是刚刚上面计算的,edge 的属性是 highschool 数据框本来就有的。

使用 ggraph 等函数可以将这个一个图可视化。

# plot using ggraph
ggraph(graph, layout = 'kk') + 
    geom_edge_fan(aes(alpha = stat(index)), show.legend = FALSE) + 
    geom_node_point(aes(size = Popularity)) + 
    facet_edges(~year) + 
    theme_graph(foreground = 'steelblue', fg_text_colour = 'white')
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): Windows字体数据
## 库里没有这样的字体系列
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): Windows字体数据
## 库里没有这样的字体系列

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): Windows字体数据
## 库里没有这样的字体系列
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

在这里,分两年显示了学生间的亲密关系,与更多人有联系的同学受欢迎程度更大(Popularity),其节点的大小越大。

核心概念

  • 布局(The Layouts):定义节点的位置,本质上给出了每个节点在图上的 xy 坐标。ggraphigraph 原有的布局函数上,又添加了一些(如 hive plots,treemaps 和 circle packing)。
  • 节点(The Nodes):图上的节点。使用 geom_node_*() 函数家族可视化。一些 geoms 适用于特定 布局(如 geom_node_tile() 适用于 treemaps 和 icicle 图形),而另外一些则具有普适性(如 geom_node_point()
  • 边(The Edges):是节点之间的连线。使用 geom_edge_*() 函数家族可视化,不同的场景下会有不同的边的类型。

Layouts

Source: vignettes/Layouts.Rmd

布局的本质是坐标系中的位置。布局函数所做的事情就是接受一个图的数据结构的输入,计算后输出 xy 坐标。

默认情况下,会调用 auto 布局。

set_graph_style(plot_margin = margin(1,1,1,1))
graph <- as_tbl_graph(highschool)

# Not specifying the layout - defaults to "auto"
ggraph(graph) + 
  geom_edge_link(aes(colour = factor(year))) + 
  geom_node_point()
## Using `stress` as default layout
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

ggraph() 指定布局的同时还可以添加参数。

ggraph(graph, layout = 'kk', maxiter = 100) + 
  geom_edge_link(aes(colour = factor(year))) + 
  geom_node_point()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

ggraph() 也可以使用预先计算好的布局。这在自定义布局的时候很有用。

layout <- create_layout(graph, layout = 'eigen')
## Warning in layout_with_eigen(graph, type = type, ev = eigenvector): g is
## directed. undirected version is used for the layout.
ggraph(layout) + 
  geom_edge_link(aes(colour = factor(year))) + 
  geom_node_point()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

creat_layout() 的结果是一个数据框,包括 node 的位置和属性。当然,图的其它信息也包含在其中。

head(layout)
##             x           y circular name .ggraph.orig_index .ggraph.index
## 1 -0.04317633 -0.15611549    FALSE    1                  1             1
## 2 -0.03414457 -0.20843892    FALSE    2                  2             2
## 3 -0.04963286 -0.30081095    FALSE    3                  3             3
## 4  0.18211675  0.03597610    FALSE    4                  4             4
## 5  0.18048193 -0.01111635    FALSE    5                  5             5
## 6  0.01389960 -0.19521616    FALSE    6                  6             6
attributes(layout)
## $names
## [1] "x"                  "y"                  "circular"          
## [4] "name"               ".ggraph.orig_index" ".ggraph.index"     
## 
## $row.names
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
## [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
## 
## $class
## [1] "layout_tbl_graph" "layout_ggraph"    "data.frame"      
## 
## $graph
## # A tbl_graph: 70 nodes and 506 edges
## #
## # A directed multigraph with 1 component
## #
## # Node Data: 70 x 2 (active)
##   name  .ggraph.orig_index
##   <chr>              <int>
## 1 1                      1
## 2 2                      2
## 3 3                      3
## 4 4                      4
## 5 5                      5
## 6 6                      6
## # ... with 64 more rows
## #
## # Edge Data: 506 x 3
##    from    to  year
##   <int> <int> <dbl>
## 1     1    13  1957
## 2     1    14  1957
## 3     1    20  1957
## # ... with 503 more rows
## 
## $circular
## [1] FALSE

这样的一个 数据框 是可以使用常规的 ggplot2 函数来可视化的,不过,还是建议使用 geom_node_*() 系列来操作比较好。

任何数据,只有能够转变为 tbl_graph 对象就可以使用 ggraph 可视化。

几个有意思的图形

分区表
graph <- tbl_graph(flare$vertices, flare$edges)
# An icicle plot
ggraph(graph, 'partition') + 
  geom_node_tile(aes(fill = depth), size = 0.25) +
  geom_node_text(aes(label=shortName))
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

Sunburst plot
# A sunburst plot
ggraph(graph, 'partition', circular = TRUE) + 
  geom_node_arc_bar(aes(fill = depth), size = 0.25) + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

Hive plot
graph <- as_tbl_graph(highschool) %>% 
  mutate(degree = centrality_degree())

graph <- graph %>% 
  mutate(friends = ifelse(
    centrality_degree(mode = 'in') < 5, 'few',
    ifelse(centrality_degree(mode = 'in') >= 15, 'many', 'medium')
  ))
ggraph(graph, 'hive', axis = friends, sort.by = degree) + 
  geom_edge_hive(aes(colour = factor(year))) + 
  geom_axis_hive(aes(colour = friends), size = 2, label = FALSE) + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

Hierarchical layouts 分层布局

** 关于 flare 数据 **

This dataset contains the graph that describes the class hierarchy for the Flare ActionScript visualization library. It contains both the class hierarchy as well as the import connections between classes. This dataset has been used extensively in the D3.js documentation and examples and are included here to make it easy to redo the examples in ggraph.

graph <- tbl_graph(flare$vertices, flare$edges)
set.seed(1)
ggraph(graph, 'circlepack', weight = size) + 
  geom_node_circle(aes(fill = depth), size = 0.25, n = 50) + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

set.seed(1)
ggraph(graph, 'circlepack', weight = size) + 
  geom_edge_link() + 
  geom_node_point(aes(colour = depth)) +
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

ggraph(graph, 'tree') + 
  geom_edge_diagonal()

Matrix Layouts 矩阵布局

矩阵布局可以最大程度上减少边的遮盖。

graph <- create_notable('zachary')
ggraph(graph, 'matrix', sort.by = node_rank_leafsort()) + 
  geom_edge_point(mirror = TRUE) + 
  coord_fixed()

Nodes 节点

Source:vignettes/Nodes.Rmd

节点不见得一定是点,也可以是片。

gr <- tbl_graph(flare$vertices, flare$edges)

ggraph(gr, layout = 'partition') + 
  geom_node_tile(aes(y = -y, fill = depth))
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

通过对数据进行变换,可以控制上面的图 Y 数值取负数,以及下面的图 只显示叶片

ggraph(gr, layout = 'dendrogram', circular = TRUE) + 
  geom_edge_diagonal() + 
  geom_node_point(aes(filter = leaf)) + 
  coord_fixed()

最常用的节点 geoms 是 geom_node_point(), geom_node_text()geom_node_label()

geom_node_text()geom_node_label()ggrepel 包中取得了 repel 参数,当设为 True 的时候,可以避免文字遮盖。

此外,geom_node_voronio() 也提供了一种避免遮盖的方案。

graph <- create_notable('meredith') %>% 
  mutate(group = sample(c('A', 'B'), n(), TRUE))

ggraph(graph, 'stress') + 
  geom_node_voronoi(aes(fill = group), max.radius = 1) + 
  geom_node_point() + 
  geom_edge_link() + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

还有一些其它的酷图。

l <- ggraph(gr, layout = 'partition', circular = TRUE)

## 分区表图
l + geom_node_arc_bar(aes(fill = depth)) + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## 
l + geom_edge_diagonal() + 
  geom_node_point(aes(colour = depth)) + 
  coord_fixed()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

Edges

用作者的话说,“边不仅仅是两个点之间的一条线段”。ggraph 提供了系列函数来进行边的可视化。

首先,准备一下示例数据。

library(ggraph)
library(tidygraph)
library(purrr)
library(rlang)
## 
## 载入程辑包:'rlang'
## The following objects are masked from 'package:purrr':
## 
##     %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
##     flatten_lgl, flatten_raw, invoke, list_along, modify, prepend,
##     splice
set_graph_style(plot_margin = margin(1,1,1,1))
hierarchy <- as_tbl_graph(hclust(dist(iris[, 1:4]))) %>% 
  mutate(Class = map_bfs_back_chr(node_is_root(), .f = function(node, path, ...) {
    if (leaf[node]) {
      as.character(iris$Species[as.integer(label[node])])
    } else {
      species <- unique(unlist(path$result))
      if (length(species) == 1) {
        species
      } else {
        NA_character_
      }
    }
  }))

hairball <- as_tbl_graph(highschool) %>% 
  mutate(
    year_pop = map_local(mode = 'in', .f = function(neighborhood, ...) {
      neighborhood %E>% pull(year) %>% table() %>% sort(decreasing = TRUE)
    }),
    pop_devel = map_chr(year_pop, function(pop) {
      if (length(pop) == 0 || length(unique(pop)) == 1) return('unchanged')
      switch(names(pop)[which.max(pop)],
             '1957' = 'decreased',
             '1958' = 'increased')
    }),
    popularity = map_dbl(year_pop, ~ .[1]) %|% 0
  ) %>% 
  activate(edges) %>% 
  mutate(year = as.character(year))

常规类型

## 纺锤体
ggraph(hairball, layout = 'stress') + 
  geom_edge_fan(aes(colour = year))
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## 平行宇宙
# let's make some of the student love themselves
loopy_hairball <- hairball %>% 
  bind_edges(tibble::tibble(from = 1:5, to = 1:5, year = rep('1957', 5)))
ggraph(loopy_hairball, layout = 'stress') + 
  geom_edge_link(aes(colour = year), alpha = 0.25) + 
  geom_edge_loop(aes(colour = year))
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## 密度图
ggraph(hairball, layout = 'stress') + 
  geom_edge_density(aes(fill = year)) + 
  geom_edge_link(alpha = 0.25)
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

关于上面的密度图,可以显示边类型的密度。在上面的图中,如果 1957 年的居多,则显示为偏红色;如果 1958 年的居多,则显示为偏蓝色。

斜纹和对角线

## Diagonals
ggraph(hierarchy, layout = 'dendrogram', height = height) + 
  geom_edge_diagonal()

## Bends
ggraph(hierarchy, layout = 'dendrogram', height = height) + 
  geom_edge_bend()

设定边的细节

  • 使用箭头。
  • 使用贝塞尔曲线
  • 使用标签文字

Connections

Connections 不是边,但可以用来把 节点 连起来。

支持的数据类型

要生成一个图,需要的关系型数据在 R 中有很多形式。ggraph 是在 tidygraph 包的基础上开发的,后者大部分数据结构在 ggraph 中都是原生支持的。对于新的数据类型,要想获得 ggraph 的支持,只需要扩展支持一个 as_tbl_graph 方法即可。

相关包

  • ggdendro: support dendrogram & hclust
  • ggtree: support tree-ralated
  • ggnetwork:
  • geomnet:
  • GGally:

函数速查

详见:Reference

Plot Construction

  • ggraph() create_layout()

Layouts

布局在 ggraph() 中指定,或者通过 creat_layout() 计算。

  • layout_tbl_graph_auto()
  • layout_tbl_graph_stress()
  • layout_tbl_graph_backbone()
  • layout_tbl_graph_*(), Others.

Nodes

  • geom_node_point()

    Show nodes as points

  • geom_node_text() geom_node_label()

    Annotate nodes with text

  • geom_node_tile()

    Draw the rectangles in a treemap

  • geom_node_voronoi()

    Show nodes as voronoi tiles

  • geom_node_circle()

    Show nodes as circles

  • geom_node_arc_bar()

    Show nodes as thick arcs

  • geom_node_range()

    Show nodes as a line spanning a horizontal range

Edges

  • geom_edge_link() geom_edge_link2() geom_edge_link0()

    Draw edges as straight lines between nodes

  • geom_edge_arc() geom_edge_arc2() geom_edge_arc0()

    Draw edges as Arcs

  • geom_edge_parallel() geom_edge_parallel2() geom_edge_parallel0()

    Draw multi edges as parallel lines

  • geom_edge_fan() geom_edge_fan2() geom_edge_fan0()

    Draw edges as curves of different curvature

  • geom_edge_loop() geom_edge_loop0()

    Draw edges as diagonals

  • geom_edge_diagonal() geom_edge_diagonal2() geom_edge_diagonal0()

    Draw edges as diagonals

  • geom_edge_elbow() geom_edge_elbow2() geom_edge_elbow0()

    Draw edges as elbows

  • geom_edge_bend() geom_edge_bend2() geom_edge_bend0()

    Draw edges as diagonals

  • geom_edge_hive() geom_edge_hive2() geom_edge_hive0()

    Draw edges in hive plots

  • geom_edge_span() geom_edge_span2() geom_edge_span0()

    Draw edges as vertical spans

  • geom_edge_point()

    Draw edges as glyphs

  • geom_edge_tile()

    Draw edges as glyphs

  • geom_edge_density()

    Show edges as a density map

Connections

Connections are meta-edges, connecting nodes that are not direct neighbors, either through their shortest path or directly.

  • geom_conn_bundle() geom_conn_bundle2() geom_conn_bundle0()

    Create hierarchical edge bundles between node connections

Facets

Faceting with networks is a bit different than for tabular data, as you’d often want to facet only nodes, or edges etc.

  • facet_graph()

    Create a grid of small multiples by node and/or edge attributes

  • facet_nodes()

    Create small multiples based on node attributes

  • facet_edges()

    Create small multiples based on edge attributes

Scales

While nodes uses the standard scales provided by ggplot2, edges have their own, allowing you to have different scaling for nodes and edges.

  • scale_edge_colour_*(): Edge color
  • scale_edge_fill_*(): Edge fill
  • scale_edge_alpha*(): Edge alpha
  • scale_edge_width_*(): Edge width
  • scale_edge_size_*(): Edge size
  • scale_edge_lintype*():
  • scale_edge_shape*()
  • scale_label_size*(): Edge label size