| Title: | 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. |
| Authors: | Lukas P. M. Kremer [aut, cre] (ORCID: <https://orcid.org/0000-0003-3170-6295>), Simon Anders [ctb] (ORCID: <https://orcid.org/0000-0003-4868-1805>) |
| Maintainer: | Lukas P. M. Kremer <[email protected]> |
| License: | GPL (>= 3) |
| Version: | 0.2.1 |
| Built: | 2026-05-17 07:48:42 UTC |
| Source: | https://github.com/lkremer/ggpointdensity |
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.
count_neighbors(x, y, r2, xy)count_neighbors(x, y, r2, xy)
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). |
A numeric vector where each element represents the count of neighboring points within the specified radius for each point.
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.
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 )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 )
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 |
geom_point() understands the following aesthetics. Required aesthetics are displayed in bold and defaults are displayed for optional aesthetics:
| • | x |
|
| • | y |
|
| • | alpha |
→ NA |
| • | colour |
→ via theme() |
| • | fill |
→ via theme() |
| • | group |
→ inferred |
| • | shape |
→ via theme() |
| • | size |
→ via theme() |
| • | stroke |
→ via theme()
|
The fill aesthetic only applies to shapes 21-25.
Learn more about setting these aesthetics in vignette("ggplot2-specs").
Lukas PM Kremer & Simon Anders
You can find examples and demo plots at https://github.com/LKremer/ggpointdensity
library(ggpointdensity) library(ggplot2) library(dplyr) # generate some toy data dat <- bind_rows( tibble(x = rnorm(3500, sd = 1), y = rnorm(3500, sd = 10), group = "foo"), tibble(x = rnorm(1500, mean = 1, sd = .5), y = rnorm(1500, 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))library(ggpointdensity) library(ggplot2) library(dplyr) # generate some toy data dat <- bind_rows( tibble(x = rnorm(3500, sd = 1), y = rnorm(3500, sd = 10), group = "foo"), tibble(x = rnorm(1500, mean = 1, sd = .5), y = rnorm(1500, 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))
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.
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 )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 )
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 |
geom_point() understands the following aesthetics. Required aesthetics are displayed in bold and defaults are displayed for optional aesthetics:
| • | x |
|
| • | y |
|
| • | alpha |
→ NA |
| • | colour |
→ via theme() |
| • | fill |
→ via theme() |
| • | group |
→ inferred |
| • | shape |
→ via theme() |
| • | size |
→ via theme() |
| • | stroke |
→ via theme()
|
The fill aesthetic only applies to shapes 21-25.
Learn more about setting these aesthetics in vignette("ggplot2-specs").
Lukas PM Kremer & Simon Anders
You can find examples and demo plots at https://github.com/LKremer/ggpointdensity
library(ggpointdensity) library(ggplot2) library(dplyr) # generate some toy data dat <- bind_rows( tibble(x = rnorm(3500, sd = 1), y = rnorm(3500, sd = 10), group = "foo"), tibble(x = rnorm(1500, mean = 1, sd = .5), y = rnorm(1500, 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))library(ggpointdensity) library(ggplot2) library(dplyr) # generate some toy data dat <- bind_rows( tibble(x = rnorm(3500, sd = 1), y = rnorm(3500, sd = 10), group = "foo"), tibble(x = rnorm(1500, mean = 1, sd = .5), y = rnorm(1500, 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))