knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.ext = "png", dev = "png" )
With the waist
aesthetic you can modify the shape of the edge curve, this is
presented in more detail in the [Curve shape] section. Here it is shown how Nodes and edges can
be decorated with the colour
(border of nodes and edges), fill
(inside of nodes and edges),
and alpha
aesthetics.
library(ggsankeyfier) library(ggplot2) theme_set(theme_light()) data("ecosystem_services") ## Let's subset the example data to create a less cluttered ## Sankey diagram es_sub <- ecosystem_services |> subset(RCSES > 0.005) |> pivot_stages_longer(c("activity_realm", "biotic_realm", "service_section"), "RCSES", "service_section") ggplot( data = es_sub, mapping = aes(x = stage, y = RCSES, group = node, edge_id = edge_id, connector = connector, colour = stage)) + ## apply fill and alpha aesthetic only to edges (not the nodes) geom_sankeyedge(aes(alpha = RCSES, fill = service_section)) + geom_sankeynode() + guides(fill = guide_legend(ncol = 1), alpha = guide_legend(ncol = 1), colour = guide_legend(ncol = 1)) + theme(legend.position = "top")
Note that both nodes and edges can be decorated separately. Also note that each variable that is assigned to one or more aesthetics will get its own guide legend. More about this in the section [Keys and legends].
When you want to add additional layers to your plot (such as text labels), it is important
that those layers apply the same statistics and positioning as the geom_sankeyedge
or
geom_node
layers. To illustrate we first need a base plot onto which the layers can be added:
pos <- position_sankey(v_space = "auto", order = "ascending", align = "justify") p <- ggplot( data = es_sub, mapping = aes(x = stage, y = RCSES, group = node, edge_id = edge_id, connector = connector))
When you want to add additional layers and you want to let them line up with the nodes and
edges, all you need to do is: use a consistent call to position_sankey()
for all layers;
and add the stat_sankeyedge()
when you want to line up your layer with the edges in the
sankey diagram. This is shown in the example below where a ggplot2::geom_segment()
layer is added to the plot.
p + geom_sankeynode(position = pos) + geom_segment(aes(col = service_section), position = pos, stat = "sankeyedge", arrow = arrow(length = unit(0.2, "cm")))
When you want to align your layer with the nodes in a diagram, you need to add stat_sankeynode()
to your layer. Below a ggplot2::geom_bar()
layer is added to the plot, which appears as a normal
geom_sankeynode()
layer. This is because they are very similar but mostly just differ in the
positioning and stats that are applied.
p + geom_sankeyedge(aes(fill = service_section), position = pos) + geom_bar(position = pos, stat = "sankeynode")
The curves that connect the nodes in ggsankeyfier
are drawn as symmetrical widened
Bézier curves. The slope of
the curve can be controlled with the slope
parameter. The curve becomes very steep when
slope = 1
:
p + geom_sankeyedge(slope = 1, position = pos, mapping = aes(fill = service_section)) + geom_sankeynode(position = pos)
You could even go beyond the slope
of 1, but then the curve will start to zigzag. With values
less than 1 will result in gentler slopes.
We can also play with how much the curve is widened. By default the width of the curve is
constant along the Bézier curve it follows. By setting the waist
aesthetic, the width
of the curve is blown up, or shrunk down at its center. There are also scale_waist_*
functions
(like scale_waist_continuous()
), which allow you to adjust the appearance of the waist
and its legend keys.
p + geom_sankeyedge(aes(waist = RCSES, fill = service_section), position = pos) + geom_sankeynode(position = pos)
Both nodes and edges have their own draw_key()
function, meaning that they are
drawn automatically by ggplot2::guide_legend()
. When multiple aesthetics
are based on the same variable, they are combined in a single legend (where possible).
In order to make this work, you will use the same guide ("legend"
in case of the example
below) for both scales.
p + geom_sankeyedge(aes(waist = RCSES, fill = RCSES), position = pos) + geom_sankeynode(position = pos) + scale_waist_binned(guide = "legend") + scale_fill_binned(guide = "legend")
At the top of this vignette we set ggplot2::theme_light()
as the default theme.
It is also possible to add themes directly to the plot:
p + geom_sankeyedge(aes(fill = RCSES), position = pos) + geom_sankeynode(position = pos) + theme_void()
To change the colour scheme of the coloured aesthetics, you need to add the appropriate colour scale. Let's add some turbo colours to our diagram:
p + geom_sankeyedge(aes(fill = RCSES), position = pos) + geom_sankeynode(position = pos) + scale_fill_viridis_c(option = "turbo")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.