Title: | Make DenseLines Heatmaps with 'ggplot2' |
Version: | 0.2.0 |
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>. |
License: | GPL (≥ 3) |
Encoding: | UTF-8 |
RoxygenNote: | 7.3.2 |
SystemRequirements: | Cargo (Rust's package manager), rustc >= 1.70.0 |
Config/gglinedensity/MSRV: | 1.70.0 |
Imports: | cli, ggplot2, lifecycle, rlang, scales, vctrs, vdiffr |
URL: | https://github.com/hrryt/gglinedensity, https://hrryt.github.io/gglinedensity/ |
BugReports: | https://github.com/hrryt/gglinedensity/issues |
Suggests: | testthat (≥ 3.0.0) |
Config/testthat/edition: | 3 |
NeedsCompilation: | yes |
Packaged: | 2025-05-21 00:11:44 UTC; harry |
Author: | 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 |
Maintainer: | Harry Thompson <harry@mayesfield.uk> |
Repository: | CRAN |
Date/Publication: | 2025-05-22 23:40:02 UTC |
Create a DenseLines Heatmap
Description
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()
.
Usage
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
)
Arguments
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 |
numeric vector giving number of bins in both vertical and horizontal directions. Set to 30 by default. |
binwidth |
Numeric vector giving bin width in both vertical and
horizontal directions. Overrides |
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 |
Details
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)
.
Aesthetics
stat_line_density()
understands the following aesthetics
(required aesthetics are in bold):
-
x
-
y
-
group
Computed variables
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.
Orientation
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.
References
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.
See Also
ggplot2::stat_bin_2d()
, ggplot2::geom_line()
, ggplot2::geom_raster()
.
Examples
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()