Type: | Package |
Title: | A Cross Between a 2D Density Plot and a Scatter Plot |
Version: | 0.2.0 |
Description: | A cross between a 2D density plot and a scatter plot, implemented as a 'ggplot2' geom. Points in the scatter plot are colored by the number of neighboring points. This is useful to visualize the 2D-distribution of points in case of overplotting. |
URL: | https://github.com/LKremer/ggpointdensity |
BugReports: | https://github.com/LKremer/ggpointdensity/issues |
License: | GPL (≥ 3) |
Encoding: | UTF-8 |
RoxygenNote: | 7.3.2 |
Depends: | R (≥ 3.2) |
Imports: | ggplot2 |
Suggests: | viridis, dplyr, testthat (≥ 3.0.0) |
Config/testthat/edition: | 3 |
NeedsCompilation: | yes |
Packaged: | 2025-05-16 14:45:44 UTC; lk385684 |
Author: | Lukas P. M. Kremer
|
Maintainer: | Lukas P. M. Kremer <L-Kremer@web.de> |
Repository: | CRAN |
Date/Publication: | 2025-05-16 15:30:02 UTC |
ggpointdensity: A Cross Between a 2D Density Plot and a Scatter Plot
Description
A cross between a 2D density plot and a scatter plot, implemented as a 'ggplot2' geom. Points in the scatter plot are colored by the number of neighboring points. This is useful to visualize the 2D-distribution of points in case of overplotting.
Author(s)
Maintainer: Lukas P. M. Kremer L-Kremer@web.de (ORCID)
Other contributors:
Simon Anders (ORCID) [contributor]
See Also
Useful links:
Report bugs at https://github.com/LKremer/ggpointdensity/issues
Count Neighbors within a Radius
Description
This function counts the number of neighboring points within a specified radius for each point in a given set of coordinates using a C implementation.
Usage
count_neighbors(x, y, r2, xy)
Arguments
x |
A numeric vector of x-coordinates of the points. |
y |
A numeric vector of y-coordinates of the points. |
r2 |
A numeric value representing the squared radius within which to search for neighboring points. |
xy |
A numeric value representing the aspect ratio (usually the ratio of the y-scale to the x-scale). |
Value
A numeric vector where each element represents the count of neighboring points within the specified radius for each point.
A cross between a scatter plot and a 2D density plot
Description
geom_pointdensity()
visualizes overlapping data points on a 2D
coordinate system. It combines the benefits of
geom_point()
,
geom_density2d()
, and
geom_bin2d()
by coloring individual points based
on the density of neighboring points. This approach highlights the overall
data distribution while preserving the visibility of individual outliers,
making it ideal for data exploration.
Usage
geom_pointdensity(
mapping = NULL,
data = NULL,
stat = "pointdensity",
position = "identity",
...,
method = c("auto", "kde2d", "neighbors"),
method.args = list(),
adjust = 1,
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 |
stat |
The statistical transformation to use on 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
|
method |
Density estimation method. Options are
|
method.args |
List of additional arguments passed on to the density
estimation function defined by |
adjust |
Multiplicative bandwidth adjustment for density estimation. A
value less than 1 (e.g., |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
Aesthetics
geom_point()
understands the following aesthetics (required aesthetics are in bold):
Learn more about setting these aesthetics in vignette("ggplot2-specs")
.
Author(s)
Lukas PM Kremer & Simon Anders
See Also
You can find examples and demo plots at https://github.com/LKremer/ggpointdensity
Examples
library(ggpointdensity)
library(ggplot2)
library(dplyr)
# generate some toy data
dat <- bind_rows(
tibble(x = rnorm(7000, sd = 1),
y = rnorm(7000, sd = 10),
group = "foo"),
tibble(x = rnorm(3000, mean = 1, sd = .5),
y = rnorm(3000, mean = 7, sd = 5),
group = "bar"))
# plot it with geom_pointdensity()
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity()
# adjust the smoothing bandwidth,
# i.e. the radius around the points
# in which neighbors are counted
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = .1)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = 4)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = 4) +
scale_colour_continuous(low = "red", high = "black")
# I recommend the viridis package
# for a more useful color scale
library(viridis)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis()
# Of course you can combine the geom with standard
# ggplot2 features such as facets...
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
facet_wrap(~ group)
# ... or point shape and size:
dat_subset <- sample_frac(dat, .1) #' smaller data set
ggplot(data = dat_subset, mapping = aes(x = x, y = y)) +
geom_pointdensity(size = 3, shape = 17) +
scale_color_viridis()
# Zooming into the axis works as well, keep in mind
# that xlim() and ylim() affect the density since they
# remove data points.
# It may be better to use coord_cartesian() instead.
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
xlim(c(-1, 3)) + ylim(c(-5, 15))
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
coord_cartesian(xlim = c(-1, 3), ylim = c(-5, 15))
A cross between a scatter plot and a 2D density plot
Description
geom_pointdensity()
visualizes overlapping data points on a 2D
coordinate system. It combines the benefits of
geom_point()
,
geom_density2d()
, and
geom_bin2d()
by coloring individual points based
on the density of neighboring points. This approach highlights the overall
data distribution while preserving the visibility of individual outliers,
making it ideal for data exploration.
Usage
stat_pointdensity(
mapping = NULL,
data = NULL,
geom = "point",
position = "identity",
...,
adjust = 1,
na.rm = FALSE,
method = c("auto", "kde2d", "neighbors"),
method.args = list(),
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, defaults to "point". |
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
|
adjust |
Multiplicative bandwidth adjustment for density estimation. A
value less than 1 (e.g., |
na.rm |
If |
method |
Density estimation method. Options are
|
method.args |
List of additional arguments passed on to the density
estimation function defined by |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
Aesthetics
geom_point()
understands the following aesthetics (required aesthetics are in bold):
Learn more about setting these aesthetics in vignette("ggplot2-specs")
.
Author(s)
Lukas PM Kremer & Simon Anders
See Also
You can find examples and demo plots at https://github.com/LKremer/ggpointdensity
Examples
library(ggpointdensity)
library(ggplot2)
library(dplyr)
# generate some toy data
dat <- bind_rows(
tibble(x = rnorm(7000, sd = 1),
y = rnorm(7000, sd = 10),
group = "foo"),
tibble(x = rnorm(3000, mean = 1, sd = .5),
y = rnorm(3000, mean = 7, sd = 5),
group = "bar"))
# plot it with geom_pointdensity()
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity()
# adjust the smoothing bandwidth,
# i.e. the radius around the points
# in which neighbors are counted
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = .1)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = 4)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity(adjust = 4) +
scale_colour_continuous(low = "red", high = "black")
# I recommend the viridis package
# for a more useful color scale
library(viridis)
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis()
# Of course you can combine the geom with standard
# ggplot2 features such as facets...
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
facet_wrap(~ group)
# ... or point shape and size:
dat_subset <- sample_frac(dat, .1) #' smaller data set
ggplot(data = dat_subset, mapping = aes(x = x, y = y)) +
geom_pointdensity(size = 3, shape = 17) +
scale_color_viridis()
# Zooming into the axis works as well, keep in mind
# that xlim() and ylim() affect the density since they
# remove data points.
# It may be better to use coord_cartesian() instead.
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
xlim(c(-1, 3)) + ylim(c(-5, 15))
ggplot(data = dat, mapping = aes(x = x, y = y)) +
geom_pointdensity() +
scale_color_viridis() +
coord_cartesian(xlim = c(-1, 3), ylim = c(-5, 15))