diff --git a/DESCRIPTION b/DESCRIPTION index f5378ca6..45741b02 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,4 +35,4 @@ Suggests: tibble Enhances: knitr, shiny LazyData: true -RoxygenNote: 6.0.1 +RoxygenNote: 7.1.1 diff --git a/R/sankeyNetwork.R b/R/sankeyNetwork.R index 31f99ded..bf2f7ca4 100644 --- a/R/sankeyNetwork.R +++ b/R/sankeyNetwork.R @@ -41,6 +41,7 @@ #' browser on the client so don't push it too high. #' @param sinksRight boolean. If \code{TRUE}, the last nodes are moved to the #' right border of the plot. +#' @param arrows logical value to enable directional link arrows. #' #' @examples #' \dontrun{ @@ -76,7 +77,8 @@ sankeyNetwork <- function(Links, Nodes, Source, Target, Value, NodeID, NodeGroup = NodeID, LinkGroup = NULL, units = "", colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"), fontSize = 7, fontFamily = NULL, nodeWidth = 15, nodePadding = 10, margin = NULL, - height = NULL, width = NULL, iterations = 32, sinksRight = TRUE) + height = NULL, width = NULL, iterations = 32, sinksRight = TRUE, + arrows=FALSE) { # Check if data is zero indexed check_zero(Links[, Source], Links[, Target]) @@ -132,7 +134,8 @@ sankeyNetwork <- function(Links, Nodes, Source, Target, Value, options = list(NodeID = NodeID, NodeGroup = NodeGroup, LinkGroup = LinkGroup, colourScale = colourScale, fontSize = fontSize, fontFamily = fontFamily, nodeWidth = nodeWidth, nodePadding = nodePadding, units = units, - margin = margin, iterations = iterations, sinksRight = sinksRight) + margin = margin, iterations = iterations, sinksRight = sinksRight, + arrows = arrows) # create widget htmlwidgets::createWidget(name = "sankeyNetwork", x = list(links = LinksDF, diff --git a/inst/htmlwidgets/sankeyNetwork.js b/inst/htmlwidgets/sankeyNetwork.js index 8fded80a..5dabfe47 100755 --- a/inst/htmlwidgets/sankeyNetwork.js +++ b/inst/htmlwidgets/sankeyNetwork.js @@ -121,7 +121,7 @@ HTMLWidgets.widget({ var path = sankey.link(); // draw links - var link = svg.selectAll(".link") + var link = svg.selectAll(".node") .data(links) .enter().append("path") .attr("class", "link") @@ -140,6 +140,8 @@ HTMLWidgets.widget({ .style("stroke-opacity", opacity_link); }); + + // add backwards class to cycles link.classed('backwards', function (d) { return d.target.x < d.source.x; }); @@ -173,6 +175,30 @@ HTMLWidgets.widget({ .html(function(d) { return "
" + d.source.name + " \u2192 " + d.target.name +
                 "\n" + format(d.value) + " " + options.units + "
"; }); + if (options.arrows) { + link.style("marker-end", function(d) { return "url(#arrow-" + d.key + ")"; }); + + var linkColoursArr = d3.nest().key(function(d) { return d.colour; }).entries(links); + + node.selectAll(".link") + .data(linkColoursArr) + .enter().append("marker") + .attr("id", function(d) { return "arrow-" + d.key; }) + .attr("viewBox", "0, -5, 10, 10") + .attr("refX", 10) + .attr("refY", 0) + .attr("preserveAspectRatio", "xMaxYMin meet") + .attr("Width", sankey.nodeWidth()) + .attr("markerHeight", 1) + .attr("orient", "auto-start-reverse") + //.attr("transform", "skewY(40)") + .style("fill", "context-fill") + //.style("fill", function(d) { return d.key; }) + .style("opacity", 0.5) + .append("path") + .attr("d", "M0,-5 L10,0 L0,5"); + } + node.append("rect") .attr("height", function(d) { return d.dy; }) .attr("width", sankey.nodeWidth()) diff --git a/man/MisLinks.Rd b/man/MisLinks.Rd index 13542742..1cc76274 100644 --- a/man/MisLinks.Rd +++ b/man/MisLinks.Rd @@ -4,7 +4,9 @@ \name{MisLinks} \alias{MisLinks} \title{Les Miserables character links} -\format{A data set with 254 observations of 3 variables.} +\format{ +A data set with 254 observations of 3 variables. +} \source{ See Mike Bostock \url{http://bl.ocks.org/mbostock/4062045}. } diff --git a/man/MisNodes.Rd b/man/MisNodes.Rd index c7cb5663..8cca267e 100644 --- a/man/MisNodes.Rd +++ b/man/MisNodes.Rd @@ -4,8 +4,10 @@ \name{MisNodes} \alias{MisNodes} \title{Les Miserables character nodes} -\format{A data set with 77 observations of 2 variables, plus made up -node size variable.} +\format{ +A data set with 77 observations of 2 variables, plus made up +node size variable. +} \source{ See Mike Bostock \url{http://bl.ocks.org/mbostock/4062045}. } diff --git a/man/SchoolsJournals.Rd b/man/SchoolsJournals.Rd index 2ba5483e..cabcba5e 100644 --- a/man/SchoolsJournals.Rd +++ b/man/SchoolsJournals.Rd @@ -5,7 +5,9 @@ \alias{SchoolsJournals} \title{Edge list of REF (2014) journal submissions for Politics and International Relations} -\format{A data set with 2732 rows and 3 variables.} +\format{ +A data set with 2732 rows and 3 variables. +} \source{ See REF 2014 \url{http://results.ref.ac.uk/DownloadSubmissions/ByUoa/21}. } diff --git a/man/as_treenetdf.data.frame.Rd b/man/as_treenetdf.data.frame.Rd index 3f108840..7cd4b436 100644 --- a/man/as_treenetdf.data.frame.Rd +++ b/man/as_treenetdf.data.frame.Rd @@ -4,8 +4,14 @@ \alias{as_treenetdf.data.frame} \title{Convert a data.frame to a \code{treenetdf}} \usage{ -\method{as_treenetdf}{data.frame}(data, cols = setNames(names(data), - names(data)), df_type = "treenetdf", subset = names(data), root, ...) +\method{as_treenetdf}{data.frame}( + data, + cols = setNames(names(data), names(data)), + df_type = "treenetdf", + subset = names(data), + root, + ... +) } \arguments{ \item{data}{a tree network description in one of numerous forms (see diff --git a/man/as_treenetdf.list.Rd b/man/as_treenetdf.list.Rd index e6ec2ee3..05fada3d 100644 --- a/man/as_treenetdf.list.Rd +++ b/man/as_treenetdf.list.Rd @@ -4,8 +4,7 @@ \alias{as_treenetdf.list} \title{Convert a nested list to \code{treenetdf}} \usage{ -\method{as_treenetdf}{list}(data, children_name = "children", - node_name = "name", ...) +\method{as_treenetdf}{list}(data, children_name = "children", node_name = "name", ...) } \arguments{ \item{data}{a tree network description in one of numerous forms (see diff --git a/man/chordNetwork.Rd b/man/chordNetwork.Rd index 6b6d71c1..1f343454 100644 --- a/man/chordNetwork.Rd +++ b/man/chordNetwork.Rd @@ -7,12 +7,21 @@ Mike Bostock: \url{https://github.com/mbostock/d3/wiki/Chord-Layout}. } \usage{ -chordNetwork(Data, height = 500, width = 500, initialOpacity = 0.8, - useTicks = 0, colourScale = c("#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", - "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5"), padding = 0.1, fontSize = 14, - fontFamily = "sans-serif", labels = c(), labelDistance = 30) +chordNetwork( + Data, + height = 500, + width = 500, + initialOpacity = 0.8, + useTicks = 0, + colourScale = c("#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", + "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", + "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5"), + padding = 0.1, + fontSize = 14, + fontFamily = "sans-serif", + labels = c(), + labelDistance = 30 +) } \arguments{ \item{Data}{A square matrix or data frame whose (n, m) entry represents diff --git a/man/dendroNetwork.Rd b/man/dendroNetwork.Rd index feeb8fb9..6bd14c25 100644 --- a/man/dendroNetwork.Rd +++ b/man/dendroNetwork.Rd @@ -9,11 +9,23 @@ Mike Bostock: \url{http://bl.ocks.org/mbostock/4063570}. Fabio Nelli: \url{http://www.meccanismocomplesso.org/en/dendrogramma-d3-parte1/} } \usage{ -dendroNetwork(hc, height = 500, width = 800, fontSize = 10, - linkColour = "#ccc", nodeColour = "#fff", nodeStroke = "steelblue", - textColour = "#111", textOpacity = 0.9, textRotate = NULL, - opacity = 0.9, margins = NULL, linkType = c("elbow", "diagonal"), - treeOrientation = c("horizontal", "vertical"), zoom = FALSE) +dendroNetwork( + hc, + height = 500, + width = 800, + fontSize = 10, + linkColour = "#ccc", + nodeColour = "#fff", + nodeStroke = "steelblue", + textColour = "#111", + textOpacity = 0.9, + textRotate = NULL, + opacity = 0.9, + margins = NULL, + linkType = c("elbow", "diagonal"), + treeOrientation = c("horizontal", "vertical"), + zoom = FALSE +) } \arguments{ \item{hc}{a hierarchical (\code{hclust}) cluster object.} diff --git a/man/diagonalNetwork.Rd b/man/diagonalNetwork.Rd index 2bc47050..4d054457 100644 --- a/man/diagonalNetwork.Rd +++ b/man/diagonalNetwork.Rd @@ -10,10 +10,19 @@ IEEE Transactions on Software Engineering, SE-7(2), 223-228. Mike Bostock: \url{http://bl.ocks.org/mbostock/4339083}. } \usage{ -diagonalNetwork(List, height = NULL, width = NULL, fontSize = 10, - fontFamily = "serif", linkColour = "#ccc", nodeColour = "#fff", - nodeStroke = "steelblue", textColour = "#111", opacity = 0.9, - margin = NULL) +diagonalNetwork( + List, + height = NULL, + width = NULL, + fontSize = 10, + fontFamily = "serif", + linkColour = "#ccc", + nodeColour = "#fff", + nodeStroke = "steelblue", + textColour = "#111", + opacity = 0.9, + margin = NULL +) } \arguments{ \item{List}{a hierarchical list object with a root node and children.} diff --git a/man/forceNetwork.Rd b/man/forceNetwork.Rd index 2b97ba15..66875b56 100644 --- a/man/forceNetwork.Rd +++ b/man/forceNetwork.Rd @@ -9,15 +9,33 @@ specifically for force directed networks \url{https://github.com/d3/d3/blob/master/API.md#forces-d3-force}. } \usage{ -forceNetwork(Links, Nodes, Source, Target, Value, NodeID, Nodesize, Group, - height = NULL, width = NULL, - colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"), fontSize = 7, - fontFamily = "serif", linkDistance = 50, +forceNetwork( + Links, + Nodes, + Source, + Target, + Value, + NodeID, + Nodesize, + Group, + height = NULL, + width = NULL, + colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"), + fontSize = 7, + fontFamily = "serif", + linkDistance = 50, linkWidth = JS("function(d) { return Math.sqrt(d.value); }"), - radiusCalculation = JS(" Math.sqrt(d.nodesize)+6"), charge = -30, - linkColour = "#666", opacity = 0.6, zoom = FALSE, legend = FALSE, - arrows = FALSE, bounded = FALSE, opacityNoHover = 0, - clickAction = NULL) + radiusCalculation = JS(" Math.sqrt(d.nodesize)+6"), + charge = -30, + linkColour = "#666", + opacity = 0.6, + zoom = FALSE, + legend = FALSE, + arrows = FALSE, + bounded = FALSE, + opacityNoHover = 0, + clickAction = NULL +) } \arguments{ \item{Links}{a data frame object with the links between the nodes. It should diff --git a/man/radialNetwork.Rd b/man/radialNetwork.Rd index 84313b2c..2b3f507e 100644 --- a/man/radialNetwork.Rd +++ b/man/radialNetwork.Rd @@ -10,10 +10,19 @@ IEEE Transactions on Software Engineering, SE-7(2), 223-228. Mike Bostock: \url{http://bl.ocks.org/mbostock/4063550}. } \usage{ -radialNetwork(List, height = NULL, width = NULL, fontSize = 10, - fontFamily = "serif", linkColour = "#ccc", nodeColour = "#fff", - nodeStroke = "steelblue", textColour = "#111", opacity = 0.9, - margin = NULL) +radialNetwork( + List, + height = NULL, + width = NULL, + fontSize = 10, + fontFamily = "serif", + linkColour = "#ccc", + nodeColour = "#fff", + nodeStroke = "steelblue", + textColour = "#111", + opacity = 0.9, + margin = NULL +) } \arguments{ \item{List}{a hierarchical list object with a root node and children.} diff --git a/man/sankeyNetwork.Rd b/man/sankeyNetwork.Rd index 45445951..4d0a7799 100644 --- a/man/sankeyNetwork.Rd +++ b/man/sankeyNetwork.Rd @@ -8,11 +8,28 @@ D3.js was created by Michael Bostock. See \url{http://d3js.org/} and, more specifically for Sankey diagrams \url{http://bost.ocks.org/mike/sankey/}. } \usage{ -sankeyNetwork(Links, Nodes, Source, Target, Value, NodeID, NodeGroup = NodeID, - LinkGroup = NULL, units = "", - colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"), fontSize = 7, - fontFamily = NULL, nodeWidth = 15, nodePadding = 10, margin = NULL, - height = NULL, width = NULL, iterations = 32, sinksRight = TRUE) +sankeyNetwork( + Links, + Nodes, + Source, + Target, + Value, + NodeID, + NodeGroup = NodeID, + LinkGroup = NULL, + units = "", + colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"), + fontSize = 7, + fontFamily = NULL, + nodeWidth = 15, + nodePadding = 10, + margin = NULL, + height = NULL, + width = NULL, + iterations = 32, + sinksRight = TRUE, + arrows = FALSE +) } \arguments{ \item{Links}{a data frame object with the links between the nodes. It should @@ -74,6 +91,8 @@ browser on the client so don't push it too high.} \item{sinksRight}{boolean. If \code{TRUE}, the last nodes are moved to the right border of the plot.} + +\item{arrows}{logical value to enable directional link arrows.} } \description{ Create a D3 JavaScript Sankey diagram diff --git a/man/simpleNetwork.Rd b/man/simpleNetwork.Rd index 217573b5..e96b1f4f 100644 --- a/man/simpleNetwork.Rd +++ b/man/simpleNetwork.Rd @@ -9,9 +9,21 @@ D3.js was created by Michael Bostock. See \url{http://d3js.org/} and, \url{https://github.com/d3/d3/blob/master/API.md#forces-d3-force} } \usage{ -simpleNetwork(Data, Source = 1, Target = 2, height = NULL, width = NULL, - linkDistance = 50, charge = -30, fontSize = 7, fontFamily = "serif", - linkColour = "#666", nodeColour = "#3182bd", opacity = 0.6, zoom = F) +simpleNetwork( + Data, + Source = 1, + Target = 2, + height = NULL, + width = NULL, + linkDistance = 50, + charge = -30, + fontSize = 7, + fontFamily = "serif", + linkColour = "#666", + nodeColour = "#3182bd", + opacity = 0.6, + zoom = F +) } \arguments{ \item{Data}{a data frame object with three columns. The first two are the diff --git a/man/treeNetwork.Rd b/man/treeNetwork.Rd index 76f13030..22264de3 100644 --- a/man/treeNetwork.Rd +++ b/man/treeNetwork.Rd @@ -4,9 +4,19 @@ \alias{treeNetwork} \title{Create collapsible tree network diagrams.} \usage{ -treeNetwork(data, width = NULL, height = NULL, treeType = "tidy", - direction = "right", linkType = "diagonal", defaults = NULL, - mouseover = "", mouseout = "", inbrowser = FALSE, ...) +treeNetwork( + data, + width = NULL, + height = NULL, + treeType = "tidy", + direction = "right", + linkType = "diagonal", + defaults = NULL, + mouseover = "", + mouseout = "", + inbrowser = FALSE, + ... +) } \arguments{ \item{data}{a tree network description in one of numerous forms (see details)}