Skip to content

Commit 61f99b3

Browse files
committed
Better infrastructure for default scales.
Add methods for date/datetime. #1526
1 parent ae1abff commit 61f99b3

File tree

10 files changed

+135
-55
lines changed

10 files changed

+135
-55
lines changed

DESCRIPTION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ Collate:
170170
'scale-manual.r'
171171
'scale-shape.r'
172172
'scale-size.r'
173+
'scale-type.R'
173174
'scales-.r'
174175
'stat-bin.r'
175176
'stat-bin2d.r'

NAMESPACE

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ S3method(scale_type,default)
103103
S3method(scale_type,factor)
104104
S3method(scale_type,logical)
105105
S3method(scale_type,numeric)
106+
S3method(scale_type,ordered)
106107
S3method(str,uneval)
107108
S3method(summary,ggplot)
108109
S3method(widthDetails,stripGrob)
@@ -372,6 +373,8 @@ export(scale_color_identity)
372373
export(scale_color_manual)
373374
export(scale_colour_brewer)
374375
export(scale_colour_continuous)
376+
export(scale_colour_date)
377+
export(scale_colour_datetime)
375378
export(scale_colour_discrete)
376379
export(scale_colour_distiller)
377380
export(scale_colour_gradient)
@@ -383,6 +386,8 @@ export(scale_colour_identity)
383386
export(scale_colour_manual)
384387
export(scale_fill_brewer)
385388
export(scale_fill_continuous)
389+
export(scale_fill_date)
390+
export(scale_fill_datetime)
386391
export(scale_fill_discrete)
387392
export(scale_fill_distiller)
388393
export(scale_fill_gradient)
@@ -406,6 +411,8 @@ export(scale_shape_manual)
406411
export(scale_size)
407412
export(scale_size_area)
408413
export(scale_size_continuous)
414+
export(scale_size_date)
415+
export(scale_size_datetime)
409416
export(scale_size_discrete)
410417
export(scale_size_identity)
411418
export(scale_size_manual)

NEWS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# ggplot2 2.0.0.9000
22

3+
* `scale_size()` warns when used with categorical data.
4+
5+
* `scale_size()`, `scale_colour()`, and `scale_fill()` gain date and date-time
6+
variants (#1526).
7+
38
* `stat_function()` gains an `xlim` parameter (#1528).
49

510
* `stat_summary()` preserves sorted x order which avoids artefacts when

R/scale-size.r

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ scale_size <- scale_size_continuous
6060
#' @export
6161
#' @usage NULL
6262
scale_size_discrete <- function(..., range = c(2, 6)) {
63+
warning("Using size for a discrete variable is not advised.", call. = FALSE)
6364
discrete_scale("size", "size_d", function(n) {
6465
area <- seq(range[1] ^ 2, range[2] ^ 2, length.out = n)
6566
sqrt(area)
@@ -76,3 +77,18 @@ scale_size_area <- function(..., max_size = 6) {
7677
palette = abs_area(max_size),
7778
rescaler = rescale_max, ...)
7879
}
80+
81+
#' @rdname scale_size
82+
#' @export
83+
#' @usage NULL
84+
scale_size_datetime <- function() {
85+
scale_size_continuous(trans = "time")
86+
}
87+
88+
#' @rdname scale_size
89+
#' @export
90+
#' @usage NULL
91+
scale_size_date <- function() {
92+
scale_size_continuous(trans = "date")
93+
}
94+

R/scale-type.R

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
find_scale <- function(aes, x, env = parent.frame()) {
2+
type <- scale_type(x)
3+
candidates <- paste("scale", aes, type, sep = "_")
4+
5+
for (scale in candidates) {
6+
scale_f <- find_global(scale, env, mode = "function")
7+
if (!is.null(scale_f))
8+
return(scale_f())
9+
}
10+
11+
# Failure to find a scale is not an error because some "aesthetics" don't
12+
# need scales (e.g. group), and it allows others to extend ggplot2 with
13+
# their own aesthetics
14+
15+
return(NULL)
16+
}
17+
18+
# Look for object first in parent environment and if not found, then in
19+
# ggplot2 namespace environment. This makes it possible to override default
20+
# scales by setting them in the parent environment.
21+
find_global <- function(name, env, mode = "any") {
22+
if (exists(name, envir = env, mode = mode)) {
23+
return(get(name, envir = env, mode = mode))
24+
}
25+
26+
nsenv <- asNamespace("ggplot2")
27+
if (exists(name, envir = nsenv, mode = mode)) {
28+
return(get(name, envir = nsenv, mode = mode))
29+
}
30+
31+
NULL
32+
}
33+
34+
# Determine default type of a scale
35+
scale_type <- function(x) UseMethod("scale_type")
36+
37+
#' @export
38+
scale_type.default <- function(x) {
39+
message("Don't know how to automatically pick scale for object of type ",
40+
paste(class(x), collapse = "/"), ". Defaulting to continuous.")
41+
"continuous"
42+
}
43+
44+
#' @export
45+
scale_type.AsIs <- function(x) "identity"
46+
47+
#' @export
48+
scale_type.logical <- function(x) "discrete"
49+
50+
#' @export
51+
scale_type.character <- function(x) "discrete"
52+
53+
#' @export
54+
scale_type.ordered <- function(x) c("ordinal", "discrete")
55+
56+
#' @export
57+
scale_type.factor <- function(x) "discrete"
58+
59+
#' @export
60+
scale_type.POSIXt <- function(x) c("datetime", "continuous")
61+
62+
#' @export
63+
scale_type.Date <- function(x) c("date", "continuous")
64+
65+
#' @export
66+
scale_type.numeric <- function(x) "continuous"

R/scales-.r

Lines changed: 5 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ ScalesList <- ggproto("ScalesList", NULL,
1818
},
1919

2020
add = function(self, scale) {
21+
if (is.null(scale)) {
22+
return()
23+
}
24+
2125
prev_aes <- self$find(scale$aesthetics)
2226
if (any(prev_aes)) {
2327
# Get only the first aesthetic name in the returned vector -- it can
@@ -98,14 +102,7 @@ scales_add_defaults <- function(scales, data, aesthetics, env) {
98102
)
99103

100104
for (aes in names(datacols)) {
101-
type <- scale_type(datacols[[aes]])
102-
scale_name <- paste("scale", aes, type, sep = "_")
103-
104-
# Skip aesthetics with no scales (e.g. group, order, etc)
105-
scale_f <- find_global(scale_name, env, mode = "function")
106-
if (is.null(scale_f)) next
107-
108-
scales$add(scale_f())
105+
scales$add(find_scale(aes, datacols[[aes]], env))
109106
}
110107

111108
}
@@ -126,50 +123,3 @@ scales_add_missing <- function(plot, aesthetics, env) {
126123
}
127124

128125

129-
# Look for object first in parent environment and if not found, then in
130-
# ggplot2 namespace environment. This makes it possible to override default
131-
# scales by setting them in the parent environment.
132-
find_global <- function(name, env, mode = "any") {
133-
if (exists(name, envir = env, mode = mode)) {
134-
return(get(name, envir = env, mode = mode))
135-
}
136-
137-
nsenv <- asNamespace("ggplot2")
138-
if (exists(name, envir = nsenv, mode = mode)) {
139-
return(get(name, envir = nsenv, mode = mode))
140-
}
141-
142-
NULL
143-
}
144-
145-
146-
# Determine default type of a scale
147-
scale_type <- function(x) UseMethod("scale_type")
148-
149-
#' @export
150-
scale_type.default <- function(x) {
151-
message("Don't know how to automatically pick scale for object of type ",
152-
paste(class(x), collapse = "/"), ". Defaulting to continuous")
153-
"continuous"
154-
}
155-
156-
#' @export
157-
scale_type.AsIs <- function(x) "identity"
158-
159-
#' @export
160-
scale_type.logical <- function(x) "discrete"
161-
162-
#' @export
163-
scale_type.character <- function(x) "discrete"
164-
165-
#' @export
166-
scale_type.factor <- function(x) "discrete"
167-
168-
#' @export
169-
scale_type.POSIXt <- function(x) "datetime"
170-
171-
#' @export
172-
scale_type.Date <- function(x) "date"
173-
174-
#' @export
175-
scale_type.numeric <- function(x) "continuous"

R/zxx.r

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ scale_colour_discrete <- scale_colour_hue
1010
#' @usage NULL
1111
scale_colour_continuous <- scale_colour_gradient
1212

13+
#' @export
14+
#' @rdname scale_gradient
15+
#' @usage NULL
16+
scale_colour_datetime <- function() {
17+
scale_colour_continuous(trans = "time")
18+
}
19+
20+
#' @export
21+
#' @rdname scale_gradient
22+
#' @usage NULL
23+
scale_colour_date <- function() {
24+
scale_colour_continuous(trans = "date")
25+
}
26+
1327
#' @export
1428
#' @rdname scale_hue
1529
#' @usage NULL
@@ -20,6 +34,21 @@ scale_fill_discrete <- scale_fill_hue
2034
#' @usage NULL
2135
scale_fill_continuous <- scale_fill_gradient
2236

37+
#' @export
38+
#' @rdname scale_gradient
39+
#' @usage NULL
40+
scale_fill_datetime <- function() {
41+
scale_fill_continuous(trans = "time")
42+
}
43+
44+
#' @export
45+
#' @rdname scale_gradient
46+
#' @usage NULL
47+
scale_fill_date <- function() {
48+
scale_fill_continuous(trans = "date")
49+
}
50+
51+
2352
# British to American spellings ----------------------------------------------
2453

2554
#' @export

man/scale_gradient.Rd

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/scale_size.Rd

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/Rplots.pdf

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)