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)}