# Required packages
library(ggraph) # for dev version: devtools::install_github('thomasp85/ggraph')
library(tidygraph)
The code is taken from blog post of author of tidygraph.
Node and edge types
create_tree(20, 3) %>%
mutate(leaf = node_is_leaf(), root = node_is_root()) %>%
ggraph(layout = 'tree') +
geom_edge_diagonal() +
geom_node_point(aes(filter = leaf), colour = 'forestgreen', size = 10) +
geom_node_point(aes(filter = root), colour = 'firebrick', size = 10) +
theme_graph()

Centrality
play_smallworld(1, 100, 3, 0.05) %>%
mutate(centrality = centrality_authority()) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point(aes(size = centrality, colour = centrality)) +
scale_color_continuous(guide = 'legend') +
theme_graph()

Clustering
play_islands(5, 10, 0.8, 3) %>%
mutate(community = as.factor(group_infomap())) %>%
ggraph(layout = 'kk') +
geom_edge_link(aes(alpha = ..index..), show.legend = FALSE) +
geom_node_point(aes(colour = community), size = 7) +
theme_graph()

Node pairs
Some statistics are a measure between two nodes, such as distance or similarity between nodes. In a tidy context one of the ends must always be the node defined by the row, while the other can be any other node. All of the node pair functions are prefixed with node_* and ends with _from/_to if the measure is not symmetric and _with if it is; e.g. there’s both a node_max_flow_to() and node_max_flow_from() function while only a single node_cocitation_with() function. The other part of the node pair can be specified as an integer vector that will get recycled if needed, or a logical vector which will get recycled and converted to indexes with which(). This means that output from node type functions can be used directly in the calls, e.g.
play_geometry(50, 0.25) %>%
mutate(dist_to_center = node_distance_to(node_is_center())) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point(aes(size = dist_to_center), colour = 'steelblue') +
scale_size_continuous(range = c(6, 1)) +
theme_graph()

Searches
Ranking according to BFS (breath first search) and drawing the graph where node size is based on BFS
play_geometry(50, 0.25) %>%
mutate(order = bfs_rank(which.max(centrality_alpha()))) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point(aes(size = order), colour = 'steelblue') +
# scale_size_continuous(range = c(6, 1)) +
theme_graph()

Ranking according to DFS (depth first search) and drawing the graph where node size is based on DFS
play_geometry(50, 0.25) %>%
mutate(order = dfs_rank(which.max(centrality_alpha()))) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point(aes(size = order), colour = 'steelblue') +
# scale_size_continuous(range = c(6, 1)) +
theme_graph()

Local measures
# Weight the node degree by the average degree of its neighboors
play_smallworld(1, 100, 3, 0.05) %>%
mutate(weighted_degree = centrality_degree() / local_ave_degree())
# A tbl_graph: 100 nodes and 300 edges
#
# An undirected simple graph with 1 component
#
# Node Data: 100 x 1 (active)
weighted_degree
<dbl>
1 1.0000000
2 0.9473684
3 1.1666667
4 1.0652174
5 1.1136364
6 0.7575758
# ... with 94 more rows
#
# Edge Data: 300 x 2
from to
<int> <int>
1 1 2
2 2 3
3 3 4
# ... with 297 more rows
sample_graph <- create_notable('meredith')
play_geometry(50, 0.25) %>%
mutate(order = bfs_rank(which.max(centrality_alpha()))) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point(colour = 'steelblue',size=7) +
geom_node_text(aes(label=order)) +
theme_graph()

play_erdos_renyi(10, 0.5) %>%
activate(nodes) %>%
mutate(degree = centrality_degree()) %>%
activate(edges) %>%
mutate(centrality = centrality_edge_betweenness()) %>%
ggraph(layout = 'kk') +
geom_edge_link() +
geom_node_point( aes(size = 8, colour = degree) ) +
# geom_node_text(aes(label = name), colour = 'white', vjust = 0.4) +
ggtitle('Test Erdos-Renyi graph') +
theme_graph()

LS0tCnRpdGxlOiAiVGlkeWdyYXBoIEV4YW1wbGUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoZ2dyYXBoKQpsaWJyYXJ5KHRpZHlncmFwaCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQojIFJlcXVpcmVkIHBhY2thZ2VzCmxpYnJhcnkoZ2dyYXBoKSAgICAgICAjIGZvciBkZXYgdmVyc2lvbjogZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCd0aG9tYXNwODUvZ2dyYXBoJykKbGlicmFyeSh0aWR5Z3JhcGgpCmBgYAoKVGhlIGNvZGUgaXMgdGFrZW4gZnJvbSBbYmxvZyBwb3N0XShodHRwOi8vd3d3LmRhdGEtaW1hZ2luaXN0LmNvbS8yMDE3L0ludHJvZHVjaW5nLXRpZHlncmFwaC8pIG9mIGF1dGhvciBvZiBgdGlkeWdyYXBoYC4KCiMjIE5vZGUgYW5kIGVkZ2UgdHlwZXMKCmBgYHtyfQpjcmVhdGVfdHJlZSgyMCwgMykgJT4lIAogIG11dGF0ZShsZWFmID0gbm9kZV9pc19sZWFmKCksIHJvb3QgPSBub2RlX2lzX3Jvb3QoKSkgJT4lIAogIGdncmFwaChsYXlvdXQgPSAndHJlZScpICsKICBnZW9tX2VkZ2VfZGlhZ29uYWwoKSArCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhmaWx0ZXIgPSBsZWFmKSwgY29sb3VyID0gJ2ZvcmVzdGdyZWVuJywgc2l6ZSA9IDEwKSArCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhmaWx0ZXIgPSByb290KSwgY29sb3VyID0gJ2ZpcmVicmljaycsIHNpemUgPSAxMCkgKwogIHRoZW1lX2dyYXBoKCkKYGBgCgojIyBDZW50cmFsaXR5CgpgYGB7cn0KcGxheV9zbWFsbHdvcmxkKDEsIDEwMCwgMywgMC4wNSkgJT4lIAogIG11dGF0ZShjZW50cmFsaXR5ID0gY2VudHJhbGl0eV9hdXRob3JpdHkoKSkgJT4lIAogIGdncmFwaChsYXlvdXQgPSAna2snKSArIAogIGdlb21fZWRnZV9saW5rKCkgKyAKICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBjZW50cmFsaXR5LCBjb2xvdXIgPSBjZW50cmFsaXR5KSkgKyAKICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGd1aWRlID0gJ2xlZ2VuZCcpICsgCiAgdGhlbWVfZ3JhcGgoKQpgYGAKICAKIyMgQ2x1c3RlcmluZwogIApgYGB7cn0KICBwbGF5X2lzbGFuZHMoNSwgMTAsIDAuOCwgMykgJT4lIAogICAgbXV0YXRlKGNvbW11bml0eSA9IGFzLmZhY3Rvcihncm91cF9pbmZvbWFwKCkpKSAlPiUgCiAgICBnZ3JhcGgobGF5b3V0ID0gJ2trJykgKyAKICAgIGdlb21fZWRnZV9saW5rKGFlcyhhbHBoYSA9IC4uaW5kZXguLiksIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG91ciA9IGNvbW11bml0eSksIHNpemUgPSA3KSArIAogICAgdGhlbWVfZ3JhcGgoKQpgYGAKICAKIyMgTm9kZSBwYWlycwogIAogID4gU29tZSBzdGF0aXN0aWNzIGFyZSBhIG1lYXN1cmUgYmV0d2VlbiB0d28gbm9kZXMsIHN1Y2ggYXMgZGlzdGFuY2Ugb3Igc2ltaWxhcml0eSBiZXR3ZWVuIG5vZGVzLiBJbiBhIHRpZHkgY29udGV4dCBvbmUgb2YgdGhlIGVuZHMgbXVzdCBhbHdheXMgYmUgdGhlIG5vZGUgZGVmaW5lZCBieSB0aGUgcm93LCB3aGlsZSB0aGUgb3RoZXIgY2FuIGJlIGFueSBvdGhlciBub2RlLiBBbGwgb2YgdGhlIG5vZGUgcGFpciBmdW5jdGlvbnMgYXJlIHByZWZpeGVkIHdpdGggYG5vZGVfKmAgYW5kIGVuZHMgd2l0aCBgX2Zyb21gL2BfdG9gIGlmIHRoZSBtZWFzdXJlIGlzIG5vdCBzeW1tZXRyaWMgYW5kIGBfd2l0aGAgaWYgaXQgaXM7IGUuZy4gdGhlcmXigJlzIGJvdGggYSBgbm9kZV9tYXhfZmxvd190bygpYCBhbmQgYG5vZGVfbWF4X2Zsb3dfZnJvbSgpYCBmdW5jdGlvbiB3aGlsZSBvbmx5IGEgc2luZ2xlIGBub2RlX2NvY2l0YXRpb25fd2l0aCgpYCBmdW5jdGlvbi4gVGhlIG90aGVyIHBhcnQgb2YgdGhlIG5vZGUgcGFpciBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgdmVjdG9yIHRoYXQgd2lsbCBnZXQgcmVjeWNsZWQgaWYgbmVlZGVkLCBvciBhIGxvZ2ljYWwgdmVjdG9yIHdoaWNoIHdpbGwgZ2V0IHJlY3ljbGVkIGFuZCBjb252ZXJ0ZWQgdG8gaW5kZXhlcyB3aXRoIGB3aGljaCgpYC4gVGhpcyBtZWFucyB0aGF0IG91dHB1dCBmcm9tIG5vZGUgdHlwZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgZGlyZWN0bHkgaW4gdGhlIGNhbGxzLCBlLmcuCiAgCmBgYHtyfQpwbGF5X2dlb21ldHJ5KDUwLCAwLjI1KSAlPiUgCiAgICBtdXRhdGUoZGlzdF90b19jZW50ZXIgPSBub2RlX2Rpc3RhbmNlX3RvKG5vZGVfaXNfY2VudGVyKCkpKSAlPiUgCiAgICBnZ3JhcGgobGF5b3V0ID0gJ2trJykgKyAKICAgIGdlb21fZWRnZV9saW5rKCkgKyAKICAgIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IGRpc3RfdG9fY2VudGVyKSwgY29sb3VyID0gJ3N0ZWVsYmx1ZScpICsgCiAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDYsIDEpKSArIAogICAgdGhlbWVfZ3JhcGgoKQpgYGAKCiMjIFNlYXJjaGVzCgpSYW5raW5nIGFjY29yZGluZyB0byBCRlMgKGJyZWF0aCBmaXJzdCBzZWFyY2gpIGFuZCBkcmF3aW5nIHRoZSBncmFwaCB3aGVyZSBub2RlIHNpemUgaXMgYmFzZWQgb24gQkZTCgpgYGB7cn0KcGxheV9nZW9tZXRyeSg1MCwgMC4yNSkgJT4lIAogIG11dGF0ZShvcmRlciA9IGJmc19yYW5rKHdoaWNoLm1heChjZW50cmFsaXR5X2FscGhhKCkpKSkgJT4lCiAgZ2dyYXBoKGxheW91dCA9ICdraycpICsgCiAgICBnZW9tX2VkZ2VfbGluaygpICsgCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBvcmRlciksIGNvbG91ciA9ICdzdGVlbGJsdWUnKSArIAojICAgIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoNiwgMSkpICsgCiAgICB0aGVtZV9ncmFwaCgpCmBgYApSYW5raW5nIGFjY29yZGluZyB0byBERlMgKGRlcHRoIGZpcnN0IHNlYXJjaCkgYW5kIGRyYXdpbmcgdGhlIGdyYXBoIHdoZXJlIG5vZGUgc2l6ZSBpcyBiYXNlZCBvbiBERlMKCmBgYHtyfQpwbGF5X2dlb21ldHJ5KDUwLCAwLjI1KSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gZGZzX3Jhbmsod2hpY2gubWF4KGNlbnRyYWxpdHlfYWxwaGEoKSkpKSAlPiUKICBnZ3JhcGgobGF5b3V0ID0gJ2trJykgKyAKICAgIGdlb21fZWRnZV9saW5rKCkgKyAKICAgIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IG9yZGVyKSwgY29sb3VyID0gJ3N0ZWVsYmx1ZScpICsgCiMgICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYyg2LCAxKSkgKyAKICAgIHRoZW1lX2dyYXBoKCkKYGBgCiMjIExvY2FsIG1lYXN1cmVzCgpgYGB7cn0KIyBXZWlnaHQgdGhlIG5vZGUgZGVncmVlIGJ5IHRoZSBhdmVyYWdlIGRlZ3JlZSBvZiBpdHMgbmVpZ2hib29ycwpwbGF5X3NtYWxsd29ybGQoMSwgMTAwLCAzLCAwLjA1KSAlPiUgCiAgICBtdXRhdGUod2VpZ2h0ZWRfZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUoKSAvIGxvY2FsX2F2ZV9kZWdyZWUoKSkKYGBgCgoKYGBge3J9CnNhbXBsZV9ncmFwaCA8LSBjcmVhdGVfbm90YWJsZSgnbWVyZWRpdGgnKQpgYGAKCmBgYHtyfQpwbGF5X2dlb21ldHJ5KDUwLCAwLjI1KSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gYmZzX3Jhbmsod2hpY2gubWF4KGNlbnRyYWxpdHlfYWxwaGEoKSkpKSAlPiUKICBnZ3JhcGgobGF5b3V0ID0gJ2trJykgKyAKICBnZW9tX2VkZ2VfbGluaygpICsgCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG91ciA9ICdzdGVlbGJsdWUnLHNpemU9NykgKyAKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWw9b3JkZXIpKSArIAogIHRoZW1lX2dyYXBoKCkKYGBgCgpgYGB7cn0KcGxheV9lcmRvc19yZW55aSgxMCwgMC41KSAlPiUgCiAgYWN0aXZhdGUobm9kZXMpICU+JSAKICBtdXRhdGUoZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUoKSkgJT4lIAogIGFjdGl2YXRlKGVkZ2VzKSAlPiUgCiAgbXV0YXRlKGNlbnRyYWxpdHkgPSBjZW50cmFsaXR5X2VkZ2VfYmV0d2Vlbm5lc3MoKSkgJT4lCiAgZ2dyYXBoKGxheW91dCA9ICdraycpICsgCiAgZ2VvbV9lZGdlX2xpbmsoKSArIAogIGdlb21fbm9kZV9wb2ludCggYWVzKHNpemUgPSA4LCBjb2xvdXIgPSBkZWdyZWUpICkgKwojICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgY29sb3VyID0gJ3doaXRlJywgdmp1c3QgPSAwLjQpICsgCiAgZ2d0aXRsZSgnVGVzdCBFcmRvcy1SZW55aSBncmFwaCcpICsgCiAgdGhlbWVfZ3JhcGgoKQpgYGAK