-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathgeom-miss-point.R
More file actions
145 lines (144 loc) · 4.18 KB
/
Copy pathgeom-miss-point.R
File metadata and controls
145 lines (144 loc) · 4.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#' Plot Missing Data Points
#'
#' @description `geom_miss_point` provides a way to transform and plot missing
#' values in ggplot2. To do so it uses methods from ggobi to display missing
#' data points 10\% below the minimum value, so that the values can be seen on
#' the same axis.
#'
#' @include legend-draw.R
#' @name geom_miss_point
#' @note Warning message if `na.rm = T` is supplied.
#'
#' @seealso [gg_miss_case()] [gg_miss_case_cumsum()] [gg_miss_fct()]
#' [gg_miss_span()] [gg_miss_var()] [gg_miss_var_cumsum()] [gg_miss_which()]
#'
#' @param mapping Set of aesthetic mappings created by [ggplot2::aes()]
#' or [ggplot2::aes_()]. If specified and `inherit.aes = TRUE`
#' (the default), is combined with the default mapping at the top level of the
#' plot. You only need to supply mapping if there isn't a mapping defined for
#' the plot.
#'
#' @param data A data frame. If specified, overrides the default data frame
#' defined at the top level of the plot.
#'
#' @param prop_below the degree to shift the values. The default is 0.1
#'
#' @param jitter the amount of jitter to add. The default is 0.05
#'
#' @param stat The statistical transformation to use on the data for this layer, as a string.
#'
#' @param position Position adjustment, either as a string, or the result of a
#' call to a position adjustment function.
#'
#' @param na.rm If `FALSE` (the default), removes missing values with a
#' warning. If `TRUE` silently removes missing values.
#'
#' @param show.legend logical. Should this layer be included in the legends?
#' `NA`, the default, includes if any aesthetics are mapped. `FALSE`
#' never includes, and `TRUE` always includes.
#'
#' @param inherit.aes 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 shouldn't inherit behaviour from the
#' default plot specification, e.g. borders.
#'
#' @param ... other arguments passed on to [ggplot2::layer()]. There
#' are three types of arguments you can use here:
#' \itemize{
#' \item{Aesthetics: to set an aesthetic to a fixed value, like
#' `color = "red"` or `size = 3.`}
#' \item{Other arguments to the layer, for example you override the default
#' `stat` associated with the layer.}
#' \item{Other arguments passed on to the stat.}
#' }
#'
#' @param colour the colour chosen for the aesthetic
#'
#' @examples
#' \dontrun{
#' library(ggplot2)
#'
#' # using regular geom_point()
#' ggplot(airquality,
#' aes(x = Ozone,
#' y = Solar.R)) +
#' geom_point()
#'
#' # using geom_miss_point()
#' ggplot(airquality,
#' aes(x = Ozone,
#' y = Solar.R)) +
#' geom_miss_point()
#'
#' # using facets
#'
#' ggplot(airquality,
#' aes(x = Ozone,
#' y = Solar.R)) +
#' geom_miss_point() +
#' facet_wrap(~Month)
#'}
#' @export
geom_miss_point <- function(
mapping = NULL,
data = NULL,
prop_below = 0.1,
jitter = 0.05,
stat = "miss_point",
position = "identity",
colour = ..missing..,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...
) {
layer(
data = data,
mapping = mapping,
stat = stat,
geom = GeomMissPoint,
position = position,
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(
prop_below = prop_below,
jitter = jitter,
na.rm = na.rm,
...
)
)
}
#' @rdname naniar-ggproto
#' @format NULL
#' @usage NULL
#' @export
GeomMissPoint <- ggproto(
"GeomMissPoint",
GeomPoint,
required_aes = c("x", "y"),
default_aes = aes(
shape = 19,
colour = "black",
size = 1.5,
fill = NA,
alpha = NA,
stroke = 0.5
),
draw_key = draw_key_missing_point,
handle_na = function(self, data, params) data,
draw_panel = function(data, panel_scales, coord) {
coords <- coord$transform(data, panel_scales)
grid::pointsGrob(
coords$x,
coords$y,
pch = coords$shape,
gp = grid::gpar(
col = alpha(coords$colour, coords$alpha),
fill = alpha(coords$fill, coords$alpha),
# Stroke is added around the outside of the point
fontsize = coords$size * .pt + coords$stroke * .stroke / 2,
lwd = coords$stroke * .stroke / 2
)
)
}
)