Load libraries and data

library(tidygraph)
library(ggraph)
# annotate highschool graph example
# as a tidygraph
data(highschool)
graph <- as_tbl_graph(highschool)

Plot the graph as is

graph %>%
  ggraph(layout="kk") +
  geom_edge_fan(arrow=arrow()) +
  geom_node_point() +
  theme_graph(foreground=NA)

Print the graph object

graph
# A tbl_graph: 70 nodes and 506 edges
#
# A directed multigraph with 1 component
#
# Node Data: 70 x 1 (active)
  name 
  <chr>
1 1    
2 2    
3 3    
4 4    
5 5    
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

Use edge color to indicate year

graph %>%
  ggraph(layout="kk") +
    geom_edge_fan(aes(color=factor(year)), arrow=arrow()) +
    geom_node_point() +
    theme_graph(foreground=NA)

Let’s only look at the 1958 subgraph

graph %>%
  activate(edges) %>%
  filter(year == 1958) %>%
  ggraph(layout="kk") +
    geom_edge_fan(aes(color=factor(year)), arrow=arrow()) +
    geom_node_point() +
    theme_graph(foreground=NA)

Convert graph to undirected and plot

undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)
  
undirected_graph  %>%
    ggraph(layout="kk") +
    geom_edge_fan() +
    geom_node_point() +
    theme_graph(foreground=NA)

Compute degree of each vertex

undirected_graph <- undirected_graph %>%
  activate(nodes) %>%
  mutate(degree=centrality_degree())
undirected_graph
# A tbl_graph: 70 nodes and 274 edges
#
# An undirected simple graph with 1 component
#
# Node Data: 70 x 3 (active)
  name  .tidygraph_node_index degree
  <chr>                 <int>  <dbl>
1 1                         1      7
2 2                         2      3
3 3                         3      2
4 4                         4      6
5 5                         5      5
6 6                         6      6
# ... with 64 more rows
#
# Edge Data: 274 x 4
   from    to .tidygraph_edge_index .orig_data      
  <int> <int> <list>                <list>          
1     1    13 <int [1]>             <tibble [1 × 3]>
2     1    14 <int [3]>             <tibble [3 × 3]>
3     1    16 <int [1]>             <tibble [1 × 3]>
# ... with 271 more rows

Plot with node size proportional to degree

undirected_graph %>%
   ggraph(layout="kk") +
    geom_edge_fan() +
    geom_node_point(aes(size=degree)) +
    theme_graph(foreground=NA)

Let’s do the same with eigenvalue centrality

undirected_graph %>%
  activate(nodes) %>%
  mutate(centrality=centrality_eigen()) %>%
  ggraph(layout="kk") +
    geom_edge_fan() +
    geom_node_point(aes(size=centrality)) +
    theme_graph(foreground=NA)

LS0tCnRpdGxlOiAiVGlkeWdyYXBoIGV4YW1wbGUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKTG9hZCBsaWJyYXJpZXMgYW5kIGRhdGEKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHlncmFwaCkKbGlicmFyeShnZ3JhcGgpCgojIGFubm90YXRlIGhpZ2hzY2hvb2wgZ3JhcGggZXhhbXBsZQojIGFzIGEgdGlkeWdyYXBoCmRhdGEoaGlnaHNjaG9vbCkKZ3JhcGggPC0gYXNfdGJsX2dyYXBoKGhpZ2hzY2hvb2wpCmBgYAoKUGxvdCB0aGUgZ3JhcGggYXMgaXMKCmBgYHtyIHBsb3RncmFwaH0KZ3JhcGggJT4lCiAgZ2dyYXBoKGxheW91dD0ia2siKSArCiAgZ2VvbV9lZGdlX2ZhbihhcnJvdz1hcnJvdygpKSArCiAgZ2VvbV9ub2RlX3BvaW50KCkgKwogIHRoZW1lX2dyYXBoKGZvcmVncm91bmQ9TkEpCmBgYAoKUHJpbnQgdGhlIGdyYXBoIG9iamVjdAoKYGBge3J9CmdyYXBoCmBgYAoKVXNlIGVkZ2UgY29sb3IgdG8gaW5kaWNhdGUgeWVhcgoKYGBge3IgZWRnZWNvbG9yfQpncmFwaCAlPiUKICBnZ3JhcGgobGF5b3V0PSJrayIpICsKICAgIGdlb21fZWRnZV9mYW4oYWVzKGNvbG9yPWZhY3Rvcih5ZWFyKSksIGFycm93PWFycm93KCkpICsKICAgIGdlb21fbm9kZV9wb2ludCgpICsKICAgIHRoZW1lX2dyYXBoKGZvcmVncm91bmQ9TkEpCmBgYAoKTGV0J3Mgb25seSBsb29rIGF0IHRoZSAxOTU4IHN1YmdyYXBoCgpgYGB7ciBzdWJncmFwaH0KZ3JhcGggJT4lCiAgYWN0aXZhdGUoZWRnZXMpICU+JQogIGZpbHRlcih5ZWFyID09IDE5NTgpICU+JQogIGdncmFwaChsYXlvdXQ9ImtrIikgKwogICAgZ2VvbV9lZGdlX2ZhbihhZXMoY29sb3I9ZmFjdG9yKHllYXIpKSwgYXJyb3c9YXJyb3coKSkgKwogICAgZ2VvbV9ub2RlX3BvaW50KCkgKwogICAgdGhlbWVfZ3JhcGgoZm9yZWdyb3VuZD1OQSkKYGBgCgpDb252ZXJ0IGdyYXBoIHRvIHVuZGlyZWN0ZWQgYW5kIHBsb3QKCmBgYHtyIHVuZGlyZWN0ZWR9CnVuZGlyZWN0ZWRfZ3JhcGggPC0gZ3JhcGggJT4lCiAgY29udmVydCh0b191bmRpcmVjdGVkKSAlPiUKICBjb252ZXJ0KHRvX3NpbXBsZSkKICAKdW5kaXJlY3RlZF9ncmFwaCAgJT4lCiAgICBnZ3JhcGgobGF5b3V0PSJrayIpICsKICAgIGdlb21fZWRnZV9mYW4oKSArCiAgICBnZW9tX25vZGVfcG9pbnQoKSArCiAgICB0aGVtZV9ncmFwaChmb3JlZ3JvdW5kPU5BKQpgYGAKCkNvbXB1dGUgZGVncmVlIG9mIGVhY2ggdmVydGV4IAoKYGBge3IgZGVnX2NlbnRyYWxpdHl9CnVuZGlyZWN0ZWRfZ3JhcGggPC0gdW5kaXJlY3RlZF9ncmFwaCAlPiUKICBhY3RpdmF0ZShub2RlcykgJT4lCiAgbXV0YXRlKGRlZ3JlZT1jZW50cmFsaXR5X2RlZ3JlZSgpKQp1bmRpcmVjdGVkX2dyYXBoCmBgYAoKUGxvdCB3aXRoIApub2RlIHNpemUgcHJvcG9ydGlvbmFsIHRvIGRlZ3JlZQoKYGBge3IgcGxvdF9kZWdyZWV9CnVuZGlyZWN0ZWRfZ3JhcGggJT4lCiAgIGdncmFwaChsYXlvdXQ9ImtrIikgKwogICAgZ2VvbV9lZGdlX2ZhbigpICsKICAgIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZT1kZWdyZWUpKSArCiAgICB0aGVtZV9ncmFwaChmb3JlZ3JvdW5kPU5BKQpgYGAKCkxldCdzIGRvIHRoZSBzYW1lIHdpdGggZWlnZW52YWx1ZSBjZW50cmFsaXR5CgpgYGB7ciBlaWdfY2VudHJhbGl0eX0KdW5kaXJlY3RlZF9ncmFwaCAlPiUKICBhY3RpdmF0ZShub2RlcykgJT4lCiAgbXV0YXRlKGNlbnRyYWxpdHk9Y2VudHJhbGl0eV9laWdlbigpKSAlPiUKICBnZ3JhcGgobGF5b3V0PSJrayIpICsKICAgIGdlb21fZWRnZV9mYW4oKSArCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemU9Y2VudHJhbGl0eSkpICsKICAgIHRoZW1lX2dyYXBoKGZvcmVncm91bmQ9TkEpCmBgYAoK