Setup
Loading Packages
packages = c('igraph', 'tidygraph', 'ggraph', 'visNetwork', 'lubridate', 'tidyverse', 'RColorBrewer')
for(p in packages){library
if(!require(p, character.only = T)){
install.packages(p)
}
library(p, character.only = T)
}
Importing Data
GAStech_nodes <- read_csv("data/GAStech_email_node.csv")
GAStech_edges <- read_csv("data/GAStech_email_edge-v2.csv")
Manupilating Data
GAStech_edges$SentDate = dmy(GAStech_edges$SentDate)
GAStech_edges$Weekday = wday(GAStech_edges$SentDate, label = TRUE, abbr = FALSE)
GAStech_edges_aggregated <- GAStech_edges %>%
filter(MainSubject == "Work related") %>%
group_by(source, target, Weekday) %>%
summarise(Weight = n()) %>%
filter(source!=target) %>%
filter(Weight > 1) %>%
ungroup()
Creation of Graph
GAStech_graph <- tbl_graph(nodes = GAStech_nodes, edges = GAStech_edges_aggregated, directed = TRUE)
Original graph code
g <- GAStech_graph %>%
mutate(betweenness_centrality = centrality_betweenness()) %>%
mutate(closeness_centrality = centrality_closeness()) %>%
ggraph(layout = "nicely") +
geom_edge_link(aes()) +
geom_node_point(aes(colour = closeness_centrality, size=betweenness_centrality))
g + theme_graph()

Task 1
Improve the code chunk used to create the organisation network graph by using the latest functions provided in ggraph2.0
set_graph_style(family = "sans")
# new function that replaces theme_graph by fixing the graph style; I used it to fix the font error in windows
ggraph(GAStech_graph, layout = "nicely") +
geom_edge_link() +
geom_node_point(aes(size=centrality_betweenness(),colour=centrality_closeness()))

# new function that allows for self referencing
Identify three aspects of the graph visualisation in Section 6.1 that can be improved.
The original graph does not have any indication of what each node represents, rendering the visualization semi useless due to a lack of information. I propose labeling all nodes with the names of the employees.
The black edges make the graph look extremely dense and cluterred, as well as making the visualization unclear due to black being used in our colour scale for centrality_closeness(). I propose changing the colour to something more neutral, like grey.
For an organizational graph, you would most likely want to see the interactions within/outside each department. I propose displaying the type of orgnisation with the shape of the node.
Provide the sketch of your alternative design.
Using appropriate ggraph functions, plot the alternative design.
g <- ggraph(GAStech_graph, layout = "stress") +
geom_edge_link(colour = 'grey') +
geom_node_point( aes(size=centrality_betweenness(),colour=centrality_closeness(), shape = Department)) +
geom_node_text(aes(label=label), repel=TRUE, size = 2)
g

Task 2
Setup
GAStech_edges_aggregated <- GAStech_edges %>%
left_join(GAStech_nodes, by = c("sourceLabel" = "label")) %>%
rename(from = id) %>%
left_join(GAStech_nodes, by = c("targetLabel" = "label")) %>%
rename(to = id) %>%
filter(MainSubject == "Work related") %>%
group_by(from, to) %>%
summarise(weight = n()) %>%
filter(from!=to) %>%
filter(weight > 1) %>%
ungroup()
GAStech_nodes <- GAStech_nodes %>%
rename(group = Department)
visNetwork(GAStech_nodes, GAStech_edges_aggregated) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE)
Improve the design of the graph by incorporating the following interactivity:
*When a name is selected from the drop-down list, the corresponding node will not only be highlighted but also will be labelled. Furthermore, all the linked nodes of the selected node will also be labelled too.
*When a node of the interactive graph is selected, the node will not only be highlighted but also will be labelled. Furthermore, all the linked nodes of the selected node will be labelled as well.
visNetwork(GAStech_nodes, GAStech_edges_aggregated) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visOptions(highlightNearest = list(enabled= TRUE, algorithm = 'all', labelOnly = FALSE), nodesIdSelection = TRUE)
Identify three aspects of the graph visualisation in Section 7.4 that can be improved.
Although the visualization is colour coded by department, a fresh user who has not seen the code wouldn’t understand the colour coding. I propose a legend to identify the departments
When a node has alot of edges, sometimes the label gets too cluttered. I propose placing the labels inside the nodes, viewing the documentation mentions “The types with the label inside of it are: ellipse, circle, datab”
Currently, although we have a column representing weights, it is not plotted out on the graph. I propose actually using the weights in the visualization, represented by the thickness of each individual edge.
Provide the sketch of your alternative design.
Using appropriate visNetwork functions, plot the alternative design.
making a new column called “value”, vizNetwork takes this in as the weights. Reference: https://stackoverflow.com/questions/46664645/r-visnetwork-igraph-weighted-network-visualization-with-visedges
GAStech_edges_aggregated_2 = GAStech_edges_aggregated %>% mutate(value = weight)
visNetwork(GAStech_nodes, GAStech_edges_aggregated_2, width = "100%") %>%
visNodes(shape = 'datab') %>%
visEdges() %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visOptions(highlightNearest = list(enabled= TRUE, algorithm = 'all', labelOnly = FALSE), nodesIdSelection = TRUE) %>%
visLegend()
LS0tDQp0aXRsZTogIkRhdGFWaXogTWFrZW92ZXIgMiwgTGludXMgQ2hlbmcgWGluIFdlaSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0KYGBgDQoNCiMgU2V0dXANCg0KIyMjIExvYWRpbmcgUGFja2FnZXMNCmBgYHtyfQ0KcGFja2FnZXMgPSBjKCdpZ3JhcGgnLCAndGlkeWdyYXBoJywgJ2dncmFwaCcsICd2aXNOZXR3b3JrJywgJ2x1YnJpZGF0ZScsICd0aWR5dmVyc2UnLCAnUkNvbG9yQnJld2VyJykNCg0KZm9yKHAgaW4gcGFja2FnZXMpe2xpYnJhcnkNCiAgaWYoIXJlcXVpcmUocCwgY2hhcmFjdGVyLm9ubHkgPSBUKSl7DQogICAgaW5zdGFsbC5wYWNrYWdlcyhwKQ0KICB9DQogIGxpYnJhcnkocCwgY2hhcmFjdGVyLm9ubHkgPSBUKQ0KfQ0KYGBgDQojIyMgSW1wb3J0aW5nIERhdGENCmBgYHtyfQ0KR0FTdGVjaF9ub2RlcyA8LSByZWFkX2NzdigiZGF0YS9HQVN0ZWNoX2VtYWlsX25vZGUuY3N2IikNCkdBU3RlY2hfZWRnZXMgPC0gcmVhZF9jc3YoImRhdGEvR0FTdGVjaF9lbWFpbF9lZGdlLXYyLmNzdiIpDQpgYGANCiMjIyBNYW51cGlsYXRpbmcgRGF0YQ0KYGBge3J9DQpHQVN0ZWNoX2VkZ2VzJFNlbnREYXRlICA9IGRteShHQVN0ZWNoX2VkZ2VzJFNlbnREYXRlKQ0KR0FTdGVjaF9lZGdlcyRXZWVrZGF5ID0gd2RheShHQVN0ZWNoX2VkZ2VzJFNlbnREYXRlLCBsYWJlbCA9IFRSVUUsIGFiYnIgPSBGQUxTRSkNCg0KR0FTdGVjaF9lZGdlc19hZ2dyZWdhdGVkIDwtIEdBU3RlY2hfZWRnZXMgJT4lDQogIGZpbHRlcihNYWluU3ViamVjdCA9PSAiV29yayByZWxhdGVkIikgJT4lDQogIGdyb3VwX2J5KHNvdXJjZSwgdGFyZ2V0LCBXZWVrZGF5KSAlPiUNCiAgICBzdW1tYXJpc2UoV2VpZ2h0ID0gbigpKSAlPiUNCiAgZmlsdGVyKHNvdXJjZSE9dGFyZ2V0KSAlPiUNCiAgZmlsdGVyKFdlaWdodCA+IDEpICU+JQ0KICB1bmdyb3VwKCkNCmBgYA0KIyMjIENyZWF0aW9uIG9mIEdyYXBoDQpgYGB7cn0NCkdBU3RlY2hfZ3JhcGggPC0gdGJsX2dyYXBoKG5vZGVzID0gR0FTdGVjaF9ub2RlcywgZWRnZXMgPSBHQVN0ZWNoX2VkZ2VzX2FnZ3JlZ2F0ZWQsIGRpcmVjdGVkID0gVFJVRSkNCmBgYA0KIyMjIE9yaWdpbmFsIGdyYXBoIGNvZGUNCmBgYHtyfQ0KZyA8LSBHQVN0ZWNoX2dyYXBoICU+JQ0KICBtdXRhdGUoYmV0d2Vlbm5lc3NfY2VudHJhbGl0eSA9IGNlbnRyYWxpdHlfYmV0d2Vlbm5lc3MoKSkgJT4lDQogIG11dGF0ZShjbG9zZW5lc3NfY2VudHJhbGl0eSA9IGNlbnRyYWxpdHlfY2xvc2VuZXNzKCkpICU+JQ0KICBnZ3JhcGgobGF5b3V0ID0gIm5pY2VseSIpICsgDQogIGdlb21fZWRnZV9saW5rKGFlcygpKSArDQogIGdlb21fbm9kZV9wb2ludChhZXMoY29sb3VyID0gY2xvc2VuZXNzX2NlbnRyYWxpdHksIHNpemU9YmV0d2Vlbm5lc3NfY2VudHJhbGl0eSkpDQoNCmcgKyB0aGVtZV9ncmFwaCgpICANCmBgYA0KIyBUYXNrIDENCg0KIyMjIEltcHJvdmUgdGhlIGNvZGUgY2h1bmsgdXNlZCB0byBjcmVhdGUgdGhlIG9yZ2FuaXNhdGlvbiBuZXR3b3JrIGdyYXBoIGJ5IHVzaW5nIHRoZSBsYXRlc3QgZnVuY3Rpb25zIHByb3ZpZGVkIGluIGdncmFwaDIuMA0KYGBge3IgZWNobyA9IFRSVUV9DQoNCiMgbmV3IGZ1bmN0aW9uIHRoYXQgcmVwbGFjZXMgdGhlbWVfZ3JhcGggYnkgZml4aW5nIHRoZSBncmFwaCBzdHlsZTsgSSB1c2VkIGl0IHRvIGZpeCB0aGUgZm9udCBlcnJvciBpbiB3aW5kb3dzDQpzZXRfZ3JhcGhfc3R5bGUoZmFtaWx5ID0gInNhbnMiKSANCg0KIyBuZXcgb2JqZWN0IG1vZGlmaWNhdGlvbiB0aGF0IGFsbG93cyBmb3Igc2VsZiByZWZlcmVuY2luZw0KZ2dyYXBoKEdBU3RlY2hfZ3JhcGgsIGxheW91dCA9ICJuaWNlbHkiKSArIA0KICBnZW9tX2VkZ2VfbGluaygpICsNCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplPWNlbnRyYWxpdHlfYmV0d2Vlbm5lc3MoKSxjb2xvdXI9Y2VudHJhbGl0eV9jbG9zZW5lc3MoKSkpIA0KDQpgYGANCiMjIyBJZGVudGlmeSB0aHJlZSBhc3BlY3RzIG9mIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIGluIFNlY3Rpb24gNi4xIHRoYXQgY2FuIGJlIGltcHJvdmVkLg0KDQoxLiBUaGUgb3JpZ2luYWwgZ3JhcGggZG9lcyBub3QgaGF2ZSBhbnkgaW5kaWNhdGlvbiBvZiB3aGF0IGVhY2ggbm9kZSByZXByZXNlbnRzLCByZW5kZXJpbmcgdGhlIHZpc3VhbGl6YXRpb24gc2VtaSB1c2VsZXNzIGR1ZSB0byBhIGxhY2sgb2YgaW5mb3JtYXRpb24uIEkgcHJvcG9zZSBsYWJlbGluZyBhbGwgbm9kZXMgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIGVtcGxveWVlcy4gIA0KDQoyLiBUaGUgYmxhY2sgZWRnZXMgbWFrZSB0aGUgZ3JhcGggbG9vayBleHRyZW1lbHkgZGVuc2UgYW5kIGNsdXRlcnJlZCwgYXMgd2VsbCBhcyBtYWtpbmcgdGhlIHZpc3VhbGl6YXRpb24gdW5jbGVhciBkdWUgdG8gYmxhY2sgYmVpbmcgdXNlZCBpbiBvdXIgY29sb3VyIHNjYWxlIGZvciBjZW50cmFsaXR5X2Nsb3NlbmVzcygpLiBJIHByb3Bvc2UgY2hhbmdpbmcgdGhlIGNvbG91ciB0byBzb21ldGhpbmcgbW9yZSBuZXV0cmFsLCBsaWtlIGdyZXkuDQoNCjMuIEZvciBhbiBvcmdhbml6YXRpb25hbCBncmFwaCwgeW91IHdvdWxkIG1vc3QgbGlrZWx5IHdhbnQgdG8gc2VlIHRoZSBpbnRlcmFjdGlvbnMgd2l0aGluL291dHNpZGUgZWFjaCBkZXBhcnRtZW50LiBJIHByb3Bvc2UgZGlzcGxheWluZyB0aGUgdHlwZSBvZiBvcmduaXNhdGlvbiB3aXRoIHRoZSBzaGFwZSBvZiB0aGUgbm9kZS4NCg0KIyMjIFByb3ZpZGUgdGhlIHNrZXRjaCBvZiB5b3VyIGFsdGVybmF0aXZlIGRlc2lnbi4NCg0KIVtTa2V0Y2ggMV0oc2tldGNoXzEuanBnKQ0KDQoNCiMjIyBVc2luZyBhcHByb3ByaWF0ZSBnZ3JhcGggZnVuY3Rpb25zLCBwbG90IHRoZSBhbHRlcm5hdGl2ZSBkZXNpZ24uDQpgYGB7cn0NCmcgPC0gZ2dyYXBoKEdBU3RlY2hfZ3JhcGgsIGxheW91dCA9ICJzdHJlc3MiKSArIA0KICBnZW9tX2VkZ2VfbGluayhjb2xvdXIgPSAnZ3JleScpICsNCiAgZ2VvbV9ub2RlX3BvaW50KCBhZXMoc2l6ZT1jZW50cmFsaXR5X2JldHdlZW5uZXNzKCksY29sb3VyPWNlbnRyYWxpdHlfY2xvc2VuZXNzKCksIHNoYXBlID0gRGVwYXJ0bWVudCkpICsNCiAgIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbD1sYWJlbCksICByZXBlbD1UUlVFLCBzaXplID0gMikNCmcNCmBgYA0KDQojIFRhc2sgMg0KDQojIyMgU2V0dXANCmBgYHtyfQ0KR0FTdGVjaF9lZGdlc19hZ2dyZWdhdGVkIDwtIEdBU3RlY2hfZWRnZXMgJT4lDQogIGxlZnRfam9pbihHQVN0ZWNoX25vZGVzLCBieSA9IGMoInNvdXJjZUxhYmVsIiA9ICJsYWJlbCIpKSAlPiUNCiAgcmVuYW1lKGZyb20gPSBpZCkgJT4lDQogIGxlZnRfam9pbihHQVN0ZWNoX25vZGVzLCBieSA9IGMoInRhcmdldExhYmVsIiA9ICJsYWJlbCIpKSAlPiUNCiAgcmVuYW1lKHRvID0gaWQpICU+JQ0KICBmaWx0ZXIoTWFpblN1YmplY3QgPT0gIldvcmsgcmVsYXRlZCIpICU+JQ0KICBncm91cF9ieShmcm9tLCB0bykgJT4lDQogICAgc3VtbWFyaXNlKHdlaWdodCA9IG4oKSkgJT4lDQogIGZpbHRlcihmcm9tIT10bykgJT4lDQogIGZpbHRlcih3ZWlnaHQgPiAxKSAlPiUNCiAgdW5ncm91cCgpDQpHQVN0ZWNoX25vZGVzIDwtIEdBU3RlY2hfbm9kZXMgJT4lDQogIHJlbmFtZShncm91cCA9IERlcGFydG1lbnQpDQpgYGANCg0KYGBge3J9DQp2aXNOZXR3b3JrKEdBU3RlY2hfbm9kZXMsIEdBU3RlY2hfZWRnZXNfYWdncmVnYXRlZCkgJT4lDQogIHZpc0lncmFwaExheW91dChsYXlvdXQgPSAibGF5b3V0X3dpdGhfZnIiKSAlPiUNCiAgdmlzT3B0aW9ucyhoaWdobGlnaHROZWFyZXN0ID0gVFJVRSwgbm9kZXNJZFNlbGVjdGlvbiA9IFRSVUUpDQpgYGANCg0KIyMjIEltcHJvdmUgdGhlIGRlc2lnbiBvZiB0aGUgZ3JhcGggYnkgaW5jb3Jwb3JhdGluZyB0aGUgZm9sbG93aW5nIGludGVyYWN0aXZpdHk6DQoNCipXaGVuIGEgbmFtZSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB3aWxsIG5vdCBvbmx5IGJlIGhpZ2hsaWdodGVkIGJ1dCBhbHNvIHdpbGwgYmUgbGFiZWxsZWQuIEZ1cnRoZXJtb3JlLCBhbGwgdGhlIGxpbmtlZCBub2RlcyBvZiB0aGUgc2VsZWN0ZWQgbm9kZSB3aWxsIGFsc28gYmUgbGFiZWxsZWQgdG9vLg0KDQoqV2hlbiBhIG5vZGUgb2YgdGhlIGludGVyYWN0aXZlIGdyYXBoIGlzIHNlbGVjdGVkLCB0aGUgbm9kZSB3aWxsIG5vdCBvbmx5IGJlIGhpZ2hsaWdodGVkIGJ1dCBhbHNvIHdpbGwgYmUgbGFiZWxsZWQuIEZ1cnRoZXJtb3JlLCBhbGwgdGhlIGxpbmtlZCBub2RlcyBvZiB0aGUgc2VsZWN0ZWQgbm9kZSB3aWxsIGJlIGxhYmVsbGVkIGFzIHdlbGwuDQoNCmBgYHtyfQ0KdmlzTmV0d29yayhHQVN0ZWNoX25vZGVzLCBHQVN0ZWNoX2VkZ2VzX2FnZ3JlZ2F0ZWQpICU+JQ0KICB2aXNJZ3JhcGhMYXlvdXQobGF5b3V0ID0gImxheW91dF93aXRoX2ZyIikgJT4lDQogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IGxpc3QoZW5hYmxlZD0gVFJVRSwgYWxnb3JpdGhtID0gJ2FsbCcsIGxhYmVsT25seSA9IEZBTFNFKSwgbm9kZXNJZFNlbGVjdGlvbiA9IFRSVUUpDQpgYGANCg0KIyMjIElkZW50aWZ5IHRocmVlIGFzcGVjdHMgb2YgdGhlIGdyYXBoIHZpc3VhbGlzYXRpb24gaW4gU2VjdGlvbiA3LjQgdGhhdCBjYW4gYmUgaW1wcm92ZWQuDQoNCjEuIEFsdGhvdWdoIHRoZSB2aXN1YWxpemF0aW9uIGlzIGNvbG91ciBjb2RlZCBieSBkZXBhcnRtZW50LCBhIGZyZXNoIHVzZXIgd2hvIGhhcyBub3Qgc2VlbiB0aGUgY29kZSB3b3VsZG4ndCB1bmRlcnN0YW5kIHRoZSBjb2xvdXIgY29kaW5nLiBJIHByb3Bvc2UgYSBsZWdlbmQgdG8gaWRlbnRpZnkgdGhlIGRlcGFydG1lbnRzDQoNCjIuIFdoZW4gYSBub2RlIGhhcyBhbG90IG9mIGVkZ2VzLCBzb21ldGltZXMgdGhlIGxhYmVsIGdldHMgdG9vIGNsdXR0ZXJlZC4gSSBwcm9wb3NlIHBsYWNpbmcgdGhlIGxhYmVscyBpbnNpZGUgdGhlIG5vZGVzLCB2aWV3aW5nIHRoZSBkb2N1bWVudGF0aW9uIG1lbnRpb25zICJUaGUgdHlwZXMgd2l0aCB0aGUgbGFiZWwgaW5zaWRlIG9mIGl0IGFyZTogZWxsaXBzZSwgY2lyY2xlLCBkYXRhYiINCg0KMy4gQ3VycmVudGx5LCBhbHRob3VnaCB3ZSBoYXZlIGEgY29sdW1uIHJlcHJlc2VudGluZyB3ZWlnaHRzLCBpdCBpcyBub3QgcGxvdHRlZCBvdXQgb24gdGhlIGdyYXBoLiBJIHByb3Bvc2UgYWN0dWFsbHkgdXNpbmcgdGhlIHdlaWdodHMgaW4gdGhlIHZpc3VhbGl6YXRpb24sIHJlcHJlc2VudGVkIGJ5IHRoZSB0aGlja25lc3Mgb2YgZWFjaCBpbmRpdmlkdWFsIGVkZ2UuDQoNCiMjIyBQcm92aWRlIHRoZSBza2V0Y2ggb2YgeW91ciBhbHRlcm5hdGl2ZSBkZXNpZ24uDQohW1NrZXRjaCAyXShza2V0Y2hfMi5qcGcpDQoNCiMjIyBVc2luZyBhcHByb3ByaWF0ZSB2aXNOZXR3b3JrIGZ1bmN0aW9ucywgcGxvdCB0aGUgYWx0ZXJuYXRpdmUgZGVzaWduLg0KDQptYWtpbmcgYSBuZXcgY29sdW1uIGNhbGxlZCAidmFsdWUiLCB2aXpOZXR3b3JrIHRha2VzIHRoaXMgaW4gYXMgdGhlIHdlaWdodHMuIFJlZmVyZW5jZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDY2NjQ2NDUvci12aXNuZXR3b3JrLWlncmFwaC13ZWlnaHRlZC1uZXR3b3JrLXZpc3VhbGl6YXRpb24td2l0aC12aXNlZGdlcw0KDQpgYGB7ciBlY2hvID0gVFJVRX0NCg0KR0FTdGVjaF9lZGdlc19hZ2dyZWdhdGVkXzIgPSBHQVN0ZWNoX2VkZ2VzX2FnZ3JlZ2F0ZWQgJT4lIG11dGF0ZSh2YWx1ZSA9IHdlaWdodCkNCg0KYGBgDQoNCmBgYHtyfQ0KdmlzTmV0d29yayhHQVN0ZWNoX25vZGVzLCBHQVN0ZWNoX2VkZ2VzX2FnZ3JlZ2F0ZWRfMiwgd2lkdGggPSAiMTAwJSIpICU+JQ0KICB2aXNOb2RlcyhzaGFwZSA9ICdkYXRhYicpICU+JQ0KICB2aXNFZGdlcygpICU+JQ0KICB2aXNJZ3JhcGhMYXlvdXQobGF5b3V0ID0gImxheW91dF93aXRoX2ZyIikgJT4lDQogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IGxpc3QoZW5hYmxlZD0gVFJVRSwgYWxnb3JpdGhtID0gJ2FsbCcsIGxhYmVsT25seSA9IEZBTFNFKSwgbm9kZXNJZFNlbGVjdGlvbiA9IFRSVUUpICU+JQ0KICB2aXNMZWdlbmQoKQ0KYGBgDQoNCg0KDQoNCg0K