stat_panel_counts() counts the number of observations in each panel.
stat_group_counts() counts the number of observations in each group.
By default they add one or more text labels to the top right corner of each
panel. Grouping is ignored by stat_panel_counts(). If no grouping
exists, the two statistics behave similarly.
stat_panel_counts(
mapping = NULL,
data = NULL,
geom = "text_npc",
position = "identity",
label.x = "right",
label.y = "top",
na.rm = FALSE,
show.legend = FALSE,
inherit.aes = TRUE,
...
)
stat_group_counts(
mapping = NULL,
data = NULL,
geom = "text_npc",
position = "identity",
label.x = "right",
label.y = "top",
hstep = 0,
vstep = NULL,
digits = 2,
na.rm = FALSE,
show.legend = FALSE,
inherit.aes = TRUE,
...
)The aesthetic mapping, usually constructed with
aes or aes_. Only needs to be
set at the layer level if you are overriding the plot defaults.
A layer specific dataset. Rarely used, as you will not want to override the plot defaults.
The geometric object to use display the data
The position adjustment to use on this layer
numeric Coordinates (in npc units) to be used
for absolute positioning of the labels.
a logical indicating whether NA values should be stripped
before the computation proceeds.
logical. Should this layer be included in the legends?
NA, the default, includes it if any aesthetics are mapped.
FALSE never includes, and TRUE always includes.
If FALSE, overrides the default aesthetics, rather
than combining with them. This is most useful for helper functions that
define both data and aesthetics and should not inherit behaviour from the
default plot specification, e.g., borders.
other arguments passed on to layer. This
can include aesthetics whose values you want to set, not map. See
layer for more details.
numeric in npc units, the horizontal and vertical step used between labels for different groups.
integer Number of digits for fraction and percent labels.
A plot layer instance. Using as output data the counts of
observations in each plot panel or per group in each plot panel.
These statistics can be used to automatically count observations in
each panel of a plot, and by default add these counts as text labels. These
statistics, unlike stat_quadrant_counts() requires only one of
x or y aesthetics and can be used together with statistics
that have the same requirement, like stat_density().
The default position of the label is in the top right corner. When using
facets even with free limits for x and y axes, the location
of the labels is consistent across panels. This is achieved by use of
geom = "text_npc" or geom = "label_npc". To pass the
positions in native data units to label.x and label.y, pass
also explicitly geom = "text", geom = "label" or some other
geometry that use the x and/or y aesthetics. A vector with
the same length as the number of panels in the figure can be used if
needed.
If a factor is mapped to x or to y aesthetics each level
of the factor constitutes a group, in this case the default positioning and
geom using NPC pseudo aesthetics will have to be overriden by passing
geom = "text" and data coordinates used. The default for factors
may change in the future.
Data frame with one or more rows, one for each
group of observations for which counts are counted in data.
x value of label position in data- or npc units, respectively
y value of label position in data- or npc units, respectively
number of observations as an integer
number of observations as character
As shown in one example below geom_debug can be
used to print the computed values returned by any statistic. The output
shown includes also values mapped to aesthetics, like label in the
example. x and y are included in the output only if mapped.
Other Functions for quadrant and volcano plots:
geom_quadrant_lines(),
stat_quadrant_counts()
# generate artificial data with numeric x and y
set.seed(67821)
x <- 1:100
y <- rnorm(length(x), mean = 10)
group <- factor(rep(c("A", "B"), times = 50))
my.data <- data.frame(x, y, group)
# using automatically generated text labels
ggplot(my.data, aes(x, y)) +
geom_point() +
stat_panel_counts()
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_panel_counts()
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts()
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(label.x = "left", hstep = 0.06, vstep = 0)
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(aes(label = after_stat(pc.label)))
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(aes(label = after_stat(pc.label)), digits = 3)
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(aes(label = after_stat(fr.label)))
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(aes(label = after_stat(dec.label)))
# one of x or y can be a factor
# label.x or label.y along the factor can be set to "factor" together
# with the use of geom_text()
ggplot(mpg,
aes(factor(cyl), hwy)) +
stat_boxplot() +
stat_group_counts(geom = "text",
label.y = 10,
label.x = "factor") +
stat_panel_counts()
# Numeric values can be used to build labels with alternative formats
# Here with sprintf(), but paste() and format() also work.
ggplot(my.data, aes(x, y)) +
geom_point() +
stat_panel_counts(aes(label = sprintf("%i observations",
after_stat(count)))) +
scale_y_continuous(expand = expansion(mult = c(0.05, 0.12)))
ggplot(mpg,
aes(factor(cyl), hwy)) +
stat_boxplot() +
stat_group_counts(geom = "text",
aes(label = sprintf("(%i)", after_stat(count))),
label.y = 10,
label.x = "factor")
ggplot(mpg,
aes(factor(cyl), hwy)) +
stat_boxplot() +
stat_group_counts(aes(label = sprintf("n[%i]~`=`~%i",
after_stat(x), after_stat(count))),
parse = TRUE,
geom = "text",
label.y = 10,
label.x = "factor") +
stat_panel_counts(aes(label = sprintf("sum(n[i])~`=`~%i",
after_stat(count))),
parse = TRUE)
# label position
ggplot(my.data, aes(y)) +
stat_panel_counts(label.x = "left") +
stat_density(alpha = 0.5)
ggplot(my.data, aes(y, colour = group)) +
stat_group_counts(label.y = "top") +
stat_density(aes(fill = group), alpha = 0.3)
# The numeric value can be used as a label as is
ggplot(mpg,
aes(factor(cyl), hwy)) +
stat_boxplot() +
stat_group_counts(geom = "text",
aes(label = after_stat(count)),
label.x = "factor",
label.y = 10) +
annotate(geom = "text", x = 0.55, y = 10, label = "n[i]~`=`", parse = TRUE)
# We use geom_debug() to see the computed values
gginnards.installed <- requireNamespace("gginnards", quietly = TRUE)
if (gginnards.installed) {
library(gginnards)
ggplot(my.data, aes(x, y)) +
geom_point() +
stat_panel_counts(geom = "debug")
}
#> [1] "PANEL 1; group(s) NULL; 'draw_function()' input 'data' (head):"
#> npcx npcy label PANEL x y count count.label
#> 1 NA NA n=100 1 95.05 12.28333 100 n=100
if (gginnards.installed) {
ggplot(my.data, aes(x, y, colour = group)) +
geom_point() +
stat_group_counts(geom = "debug")
}
#> [1] "PANEL 1; group(s) 1, 2; 'draw_function()' input 'data' (head):"
#> colour npcx npcy label x y PANEL group count total count.label
#> 1 #F8766D NA NA n=50 100 12.54082 1 1 50 100 n=50
#> 2 #00BFC4 NA NA n=50 100 12.28333 1 2 50 100 n=50
#> pc.label dec.label fr.label
#> 1 p=50% f=0.50 50 / 100
#> 2 p=50% f=0.50 50 / 100