Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(dplyr)
- library(tidyr)
- library(networkD3)
- library(htmlwidgets)
- df <- read.csv(header = T, as.is = T, text = '
- name,origin,layover,destination
- Bob,Baltimore,Chicago,Los Angeles
- Bob,Baltimore,Chicago,Seattle
- Bob,New York,St Louis,Austin
- Bob,New York,Chicago,Seattle
- Tom,Baltimore,Chicago,Los Angeles
- Tom,New York,St Louis,San Diego
- Tom,New York,Chicago,Seattle
- Tom,New York,New Orleans,Austin
- ')
- links <-
- df %>%
- mutate(row = row_number()) %>%
- mutate(traveler = .[[1]]) %>%
- gather("column", "source", -row, -traveler) %>%
- mutate(column = match(column, names(df))) %>%
- arrange(row, column) %>%
- group_by(row) %>%
- mutate(target = lead(source)) %>%
- ungroup() %>%
- filter(!is.na(target)) %>%
- select(source, target, traveler) %>%
- group_by(source, target, traveler) %>%
- summarise(count = n()) %>%
- ungroup()
- nodes <- data.frame(name = unique(c(links$source, links$target)))
- links$source <- match(links$source, nodes$name) - 1
- links$target <- match(links$target, nodes$name) - 1
- sn <- sankeyNetwork(Links = links, Nodes = nodes, Source = 'source',
- Target = 'target', Value = 'count', NodeID = 'name',
- )
- # add origin back into the links data because sankeyNetwork strips it out
- sn$x$links$traveler <- links$traveler
- # add onRender JavaScript to set the click behavior
- htmlwidgets::onRender(
- sn,
- '
- function(el, x) {
- var nodes = d3.selectAll(".node");
- var links = d3.selectAll(".link");
- nodes.select("rect").style("cursor", "pointer");
- nodes.on("mousedown.drag", null); // remove the drag because it conflicts
- //nodes.on("mouseout", null);
- nodes.on("click", clicked);
- function clicked(d, i) {
- links
- .style("stroke-opacity", function(d1) {
- return d1.traveler == d.name ? 0.5 : 0.2;
- });
- }
- }
- '
- )
Add Comment
Please, Sign In to add comment