The following chunk reads the data into the program

HP_nodes <- read_csv("HP_nodes.csv")
Rows: 65 Columns: 3-- Column specification -------------------------------------------------------------------------------------------------
Delimiter: ","
chr (2): name, bio
dbl (1): id
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
HP_links <- read_csv("HP_links.csv")
Rows: 356 Columns: 2-- Column specification -------------------------------------------------------------------------------------------------
Delimiter: ","
dbl (2): from, to
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

This next chunk then creates the network in igraph

HP_network <- graph_from_data_frame(HP_links, 
                                           vertices = HP_nodes, 
                                           directed = F)

The following chunk determines the density of the network which divides the number of connections by the total possible connections.

HP_network %>% 
  edge_density()
[1] 0.1711538

This chunk then converts the data into a histogram displaying the distances in the network

HP_network %>% 
  distances() %>% 
  as.vector() %>%              # these two lines convert the distances matrix
  as_tibble() %>%              # to something plotly can graph
  plot_ly(x = ~value) %>% 
  add_histogram()

This chunk then gives the diameter of the network which is the longest of the distances.

HP_network %>% 
  get_diameter() %>% 
  length()
[1] 7

This then mutates and adds a label, title, and degree set to value.

HP_nodes <- HP_nodes %>% 
  mutate(label = name) %>%
  mutate(title = name) %>%
  mutate(value = degree(HP_network))
  

To mutate further, this adds a column for betweenness set to value.

HP_links %>% 
  mutate(betweenness = edge_betweenness(HP_network)) %>% 
  mutate(value = betweenness)

Finally, the diagram is created with a title and set to highlight the nearest connection to whichever character the dot represents.It also gives a menu option to find a certain character.

visNetwork(HP_nodes, 
           HP_links, 
           main = "Network of HP characters") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visOptions(highlightNearest = T, nodesIdSelection = T)

This next chunk finds the communities within the network which also means the characters that are most related and connected to one another.

HP_network %>% 
  infomap.community()
IGRAPH clustering infomap, groups: 24, mod: 0.17
+ groups:
  $`1`
  [1] "Regulus Arcturus Black" "Vincent Crabbe Sr."     "Vincent Crabbe"        
  
  $`2`
  [1] "Sirius Black"      "Albus Dumbledore"  "Nicolas Flamel"    "Olympe Maxime"     "Quirinus Quirrell"
  
  $`3`
  [1] "Lavender Brown"  "Cho Chang"       "Cedric Diggory"  "Seamus Finnigan"
  
  $`4`
  + ... omitted several groups/vertices

This chunk then puts the data into their group membership

HP_nodes <- HP_nodes %>% 
  mutate(group = membership(infomap.community(HP_network)))

HP_nodes %>% 
  datatable()

Finally, this network is complete with not only the above network’s title and highlighting, but also color coded to show which characters belong to each group.

visNetwork(HP_nodes, 
           HP_links, 
           main = "Network of HP Characters") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visOptions(highlightNearest = T, nodesIdSelection = T)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGUgZm9sbG93aW5nIGNodW5rIHJlYWRzIHRoZSBkYXRhIGludG8gdGhlIHByb2dyYW0NCg0KYGBge3J9DQpIUF9ub2RlcyA8LSByZWFkX2NzdigiSFBfbm9kZXMuY3N2IikNCkhQX2xpbmtzIDwtIHJlYWRfY3N2KCJIUF9saW5rcy5jc3YiKQ0KYGBgDQoNClRoaXMgbmV4dCBjaHVuayB0aGVuIGNyZWF0ZXMgdGhlIG5ldHdvcmsgaW4gaWdyYXBoDQoNCmBgYHtyfQ0KSFBfbmV0d29yayA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoSFBfbGlua3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzID0gSFBfbm9kZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gRikNCmBgYA0KDQpUaGUgZm9sbG93aW5nIGNodW5rIGRldGVybWluZXMgdGhlIGRlbnNpdHkgb2YgdGhlIG5ldHdvcmsgd2hpY2ggZGl2aWRlcyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGJ5IHRoZSB0b3RhbCBwb3NzaWJsZSBjb25uZWN0aW9ucy4NCg0KYGBge3J9DQpIUF9uZXR3b3JrICU+JSANCiAgZWRnZV9kZW5zaXR5KCkNCmBgYA0KVGhpcyBjaHVuayB0aGVuIGNvbnZlcnRzIHRoZSBkYXRhIGludG8gYSBoaXN0b2dyYW0gZGlzcGxheWluZyB0aGUgZGlzdGFuY2VzIGluIHRoZSBuZXR3b3JrDQpgYGB7cn0NCkhQX25ldHdvcmsgJT4lIA0KICBkaXN0YW5jZXMoKSAlPiUgDQogIGFzLnZlY3RvcigpICU+JSAgICAgICAgICAgICAgIyB0aGVzZSB0d28gbGluZXMgY29udmVydCB0aGUgZGlzdGFuY2VzIG1hdHJpeA0KICBhc190aWJibGUoKSAlPiUgICAgICAgICAgICAgICMgdG8gc29tZXRoaW5nIHBsb3RseSBjYW4gZ3JhcGgNCiAgcGxvdF9seSh4ID0gfnZhbHVlKSAlPiUgDQogIGFkZF9oaXN0b2dyYW0oKQ0KYGBgDQoNClRoaXMgY2h1bmsgdGhlbiBnaXZlcyB0aGUgZGlhbWV0ZXIgb2YgdGhlIG5ldHdvcmsgd2hpY2ggaXMgdGhlIGxvbmdlc3Qgb2YgdGhlIGRpc3RhbmNlcy4NCmBgYHtyfQ0KSFBfbmV0d29yayAlPiUgDQogIGdldF9kaWFtZXRlcigpICU+JSANCiAgbGVuZ3RoKCkNCmBgYA0KVGhpcyB0aGVuIG11dGF0ZXMgYW5kIGFkZHMgYSBsYWJlbCwgdGl0bGUsIGFuZCBkZWdyZWUgc2V0IHRvIHZhbHVlLg0KYGBge3J9DQpIUF9ub2RlcyA8LSBIUF9ub2RlcyAlPiUgDQogIG11dGF0ZShsYWJlbCA9IG5hbWUpICU+JQ0KICBtdXRhdGUodGl0bGUgPSBuYW1lKSAlPiUNCiAgbXV0YXRlKHZhbHVlID0gZGVncmVlKEhQX25ldHdvcmspKQ0KICANCmBgYA0KDQpUbyBtdXRhdGUgZnVydGhlciwgdGhpcyBhZGRzIGEgY29sdW1uIGZvciBiZXR3ZWVubmVzcyBzZXQgdG8gdmFsdWUuDQpgYGB7cn0NCkhQX2xpbmtzICU+JSANCiAgbXV0YXRlKGJldHdlZW5uZXNzID0gZWRnZV9iZXR3ZWVubmVzcyhIUF9uZXR3b3JrKSkgJT4lIA0KICBtdXRhdGUodmFsdWUgPSBiZXR3ZWVubmVzcykNCmBgYA0KRmluYWxseSwgdGhlIGRpYWdyYW0gaXMgY3JlYXRlZCB3aXRoIGEgdGl0bGUgYW5kIHNldCB0byBoaWdobGlnaHQgdGhlIG5lYXJlc3QgY29ubmVjdGlvbiB0byB3aGljaGV2ZXIgY2hhcmFjdGVyIHRoZSBkb3QgcmVwcmVzZW50cy5JdCBhbHNvIGdpdmVzIGEgbWVudSBvcHRpb24gdG8gZmluZCBhIGNlcnRhaW4gY2hhcmFjdGVyLg0KYGBge3J9DQp2aXNOZXR3b3JrKEhQX25vZGVzLCANCiAgICAgICAgICAgSFBfbGlua3MsIA0KICAgICAgICAgICBtYWluID0gIk5ldHdvcmsgb2YgSFAgY2hhcmFjdGVycyIpICU+JSANCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIA0KICB2aXNPcHRpb25zKGhpZ2hsaWdodE5lYXJlc3QgPSBULCBub2Rlc0lkU2VsZWN0aW9uID0gVCkNCmBgYA0KDQpUaGlzIG5leHQgY2h1bmsgZmluZHMgdGhlIGNvbW11bml0aWVzIHdpdGhpbiB0aGUgbmV0d29yayB3aGljaCBhbHNvIG1lYW5zIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG1vc3QgcmVsYXRlZCBhbmQgY29ubmVjdGVkIHRvIG9uZSBhbm90aGVyLg0KYGBge3J9DQpIUF9uZXR3b3JrICU+JSANCiAgaW5mb21hcC5jb21tdW5pdHkoKQ0KYGBgDQpUaGlzIGNodW5rIHRoZW4gcHV0cyB0aGUgZGF0YSBpbnRvIHRoZWlyIGdyb3VwIG1lbWJlcnNoaXANCg0KYGBge3J9DQpIUF9ub2RlcyA8LSBIUF9ub2RlcyAlPiUgDQogIG11dGF0ZShncm91cCA9IG1lbWJlcnNoaXAoaW5mb21hcC5jb21tdW5pdHkoSFBfbmV0d29yaykpKQ0KDQpIUF9ub2RlcyAlPiUgDQogIGRhdGF0YWJsZSgpDQpgYGANCkZpbmFsbHksIHRoaXMgbmV0d29yayBpcyBjb21wbGV0ZSB3aXRoIG5vdCBvbmx5IHRoZSBhYm92ZSBuZXR3b3JrJ3MgdGl0bGUgYW5kIGhpZ2hsaWdodGluZywgYnV0IGFsc28gY29sb3IgY29kZWQgdG8gc2hvdyB3aGljaCBjaGFyYWN0ZXJzIGJlbG9uZyB0byBlYWNoIGdyb3VwLg0KYGBge3J9DQp2aXNOZXR3b3JrKEhQX25vZGVzLCANCiAgICAgICAgICAgSFBfbGlua3MsIA0KICAgICAgICAgICBtYWluID0gIk5ldHdvcmsgb2YgSFAgQ2hhcmFjdGVycyIpICU+JSANCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIA0KICB2aXNPcHRpb25zKGhpZ2hsaWdodE5lYXJlc3QgPSBULCBub2Rlc0lkU2VsZWN0aW9uID0gVCkNCmBgYA0KDQo=