@@ -182,24 +182,7 @@ StatDensity2d <- ggproto("StatDensity2d", Stat,
182
182
compute_group = function (data , scales , na.rm = FALSE , h = NULL , adjust = c(1 , 1 ),
183
183
n = 100 , ... ) {
184
184
185
- if (is.null(h )) {
186
- # Note: MASS::bandwidth.nrd is equivalent to stats::bw.nrd * 4
187
- h <- c(MASS :: bandwidth.nrd(data $ x ), MASS :: bandwidth.nrd(data $ y ))
188
- # Handle case when when IQR == 0 and thus regular nrd bandwidth fails
189
- if (h [1 ] == 0 ) {
190
- h [1 ] <- bw.nrd0(data $ x ) * 4
191
- }
192
- if (h [2 ] == 0 ) {
193
- h [2 ] <- bw.nrd0(data $ y ) * 4
194
- }
195
- h <- h * adjust
196
- }
197
- if (any(is.na(h ) | h < = 0 )) {
198
- cli :: cli_abort(c(
199
- " The bandwidth argument {.arg h} must contain numbers larger than 0." ,
200
- i = " Please set the {.arg h} argument to stricly positive numbers manually."
201
- ))
202
- }
185
+ h <- precompute_2d_bw(data $ x , data $ y , h = h , adjust = adjust )
203
186
204
187
# calculate density
205
188
dens <- MASS :: kde2d(
@@ -232,3 +215,27 @@ StatDensity2dFilled <- ggproto("StatDensity2dFilled", StatDensity2d,
232
215
contour_type = " bands"
233
216
)
234
217
218
+ precompute_2d_bw <- function (x , y , h = NULL , adjust = 1 ) {
219
+
220
+ if (is.null(h )) {
221
+ # Note: MASS::bandwidth.nrd is equivalent to stats::bw.nrd * 4
222
+ h <- c(MASS :: bandwidth.nrd(x ), MASS :: bandwidth.nrd(y ))
223
+ # Handle case when when IQR == 0 and thus regular nrd bandwidth fails
224
+ if (h [1 ] == 0 && length(x ) > 1 ) h [1 ] <- bw.nrd0(x ) * 4
225
+ if (h [2 ] == 0 && length(y ) > 1 ) h [2 ] <- bw.nrd0(y ) * 4
226
+ h <- h * adjust
227
+ }
228
+
229
+ check_numeric(h )
230
+ check_length(h , 2L )
231
+
232
+ if (any(is.na(h ) | h < = 0 )) {
233
+ cli :: cli_abort(c(
234
+ " The bandwidth argument {.arg h} must contain numbers larger than 0." ,
235
+ i = " Please set the {.arg h} argument to stricly positive numbers manually."
236
+ ))
237
+ }
238
+
239
+ h
240
+ }
241
+
0 commit comments