| Title: | Make DenseLines Heatmaps with 'ggplot2' |
|---|---|
| Description: | Visualise overlapping time series lines as a heatmap of line density. Provides a 'ggplot2' statistic implementing the DenseLines algorithm, which "normalizes time series by the arc length to compute accurate densities" (Moritz and Fisher, 2018) <doi:10.48550/arXiv.1808.06019>. |
| Authors: | Harry Thompson [cre, aut, cph], Dominik Moritz [aut] (Rust original, <https://github.com/domoritz/line-density-rust>), The authors of the dependency Rust crates [ctb] (see inst/AUTHORS file for details), Hiroaki Yutani [ctb] (ORCID: <https://orcid.org/0000-0002-3385-7233>, Scripts where noted, <https://yutannihilation.github.io/string2path>) |
| Maintainer: | Harry Thompson <[email protected]> |
| License: | GPL (>= 3) |
| Version: | 0.2.0.9000 |
| Built: | 2026-05-12 08:08:19 UTC |
| Source: | https://github.com/hrryt/gglinedensity |
stat_line_density() is a 'ggplot2' statistic implementing the DenseLines
algorithm described by Moritz and Fisher (2018). stat_path_density() is to
stat_line_density() as geom_path() is to geom_line().
stat_line_density( mapping = NULL, data = NULL, geom = "raster", position = "identity", ..., bins = 30, binwidth = NULL, drop = TRUE, orientation = NA, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) stat_path_density( mapping = NULL, data = NULL, geom = "raster", position = "identity", ..., bins = 30, binwidth = NULL, drop = TRUE, orientation = NA, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )stat_line_density( mapping = NULL, data = NULL, geom = "raster", position = "identity", ..., bins = 30, binwidth = NULL, drop = TRUE, orientation = NA, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) stat_path_density( mapping = NULL, data = NULL, geom = "raster", position = "identity", ..., bins = 30, binwidth = NULL, drop = TRUE, orientation = NA, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
geom |
The geometric object to use to display the data for this layer.
When using a
|
position |
A position adjustment to use on the data for this layer. This
can be used in various ways, including to prevent overplotting and
improving the display. The
|
... |
Other arguments passed on to
|
bins |
Number of bins. Overridden by |
binwidth |
The width of the bins. Can be specified as a numeric value
or as a function that takes x after scale transformation as input and
returns a single numeric value. When specifying a function along with a
grouping structure, the function will be called once per group.
The default is to use the number of bins in The bin width of a date variable is the number of days in each time; the bin width of a time variable is the number of seconds. |
drop |
if |
orientation |
The orientation of the layer. The default ( |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
stat_line_density() provides the density variable, which normalises
count by its sum in each column of bins with the same value
of the variable on the orientation axis. This is also provided by
stat_path_density(), but should be used with caution as the DenseLines
algorithm assumes lines are connected in order of the variable on the
orientation axis. stat_path_density() therefore defaults to
aes(fill = after_stat(count)) rather than after_stat(density).
stat_line_density() understands the following aesthetics
(required aesthetics are in bold):
x
y
group
These are calculated by the 'stat' part of layers and can be accessed with delayed evaluation.
after_stat(count)
number of lines in bin.
after_stat(density)
density of lines in bin. The result of the DenseLines algorithm.
after_stat(ncount)
count, scaled to maximum of 1.
after_stat(ndensity)
density, scaled to a maximum of 1.
This geom treats each axis differently and, thus, can thus have two orientations. Often the orientation is easy to deduce from a combination of the given mappings and the types of positional scales in use. Thus, ggplot2 will by default try to guess which orientation the layer should have. Under rare circumstances, the orientation is ambiguous and guessing may fail. In that case the orientation can be specified directly using the orientation parameter, which can be either "x" or "y". The value gives the axis that the geom should run along, "x" being the default orientation you would expect for the geom.
Moritz, D. & Fisher, D. (2018). Visualizing a Million Time Series with the Density Line Chart. arXiv preprint arXiv:1409.0473. doi:10.48550/arxiv.1808.06019.
ggplot2::stat_bin_2d(), ggplot2::geom_line(), ggplot2::geom_raster().
library(ggplot2) p <- ggplot(txhousing, aes(date, median, group = city)) p + stat_line_density(drop = FALSE, na.rm = TRUE) p + aes(fill = after_stat(count)) + stat_line_density( aes(colour = after_stat(count)), geom = "point", size = 10, bins = 15, na.rm = TRUE ) + stat_line_density( aes(label = after_stat(ifelse(count > 25, count, NA))), geom = "label", size = 6, bins = 15, na.rm = TRUE ) ggplot(txhousing, aes(median, date, group = city)) + stat_line_density( aes(fill = after_stat(ndensity)), bins = 50, orientation = "y", na.rm = TRUE ) m <- ggplot(economics, aes(unemploy/pop, psavert, group = date < as.Date("2000-01-01"))) m + geom_path(aes(colour = after_stat(group))) m + stat_path_density()library(ggplot2) p <- ggplot(txhousing, aes(date, median, group = city)) p + stat_line_density(drop = FALSE, na.rm = TRUE) p + aes(fill = after_stat(count)) + stat_line_density( aes(colour = after_stat(count)), geom = "point", size = 10, bins = 15, na.rm = TRUE ) + stat_line_density( aes(label = after_stat(ifelse(count > 25, count, NA))), geom = "label", size = 6, bins = 15, na.rm = TRUE ) ggplot(txhousing, aes(median, date, group = city)) + stat_line_density( aes(fill = after_stat(ndensity)), bins = 50, orientation = "y", na.rm = TRUE ) m <- ggplot(economics, aes(unemploy/pop, psavert, group = date < as.Date("2000-01-01"))) m + geom_path(aes(colour = after_stat(group))) m + stat_path_density()