31
31
# ' @param timezone The timezone to use for display on the axes. The default
32
32
# ' (`NULL`) uses the timezone encoded in the data.
33
33
# ' @family position scales
34
+ # ' @seealso [sec_axis()] for how to specify secondary axes
34
35
# ' @examples
35
36
# ' last_month <- Sys.Date() - 0:29
36
37
# ' df <- data.frame(
49
50
# '
50
51
# ' # Set limits
51
52
# ' base + scale_x_date(limits = c(Sys.Date() - 7, NA))
53
+ # '
52
54
# ' @name scale_date
53
55
# ' @aliases NULL
54
56
NULL
@@ -64,9 +66,10 @@ scale_x_date <- function(name = waiver(),
64
66
date_minor_breaks = waiver(),
65
67
limits = NULL ,
66
68
expand = waiver(),
67
- position = " bottom" ) {
69
+ position = " bottom" ,
70
+ sec.axis = waiver()) {
68
71
69
- datetime_scale(
72
+ sc <- datetime_scale(
70
73
c(" x" , " xmin" , " xmax" , " xend" ),
71
74
" date" ,
72
75
name = name ,
@@ -82,6 +85,8 @@ scale_x_date <- function(name = waiver(),
82
85
expand = expand ,
83
86
position = position
84
87
)
88
+
89
+ set_sec_axis(sec.axis , sc )
85
90
}
86
91
87
92
# ' @rdname scale_date
@@ -95,9 +100,10 @@ scale_y_date <- function(name = waiver(),
95
100
date_minor_breaks = waiver(),
96
101
limits = NULL ,
97
102
expand = waiver(),
98
- position = " left" ) {
103
+ position = " left" ,
104
+ sec.axis = waiver()) {
99
105
100
- datetime_scale(
106
+ sc <- datetime_scale(
101
107
c(" y" , " ymin" , " ymax" , " yend" ),
102
108
" date" ,
103
109
name = name ,
@@ -113,6 +119,8 @@ scale_y_date <- function(name = waiver(),
113
119
expand = expand ,
114
120
position = position
115
121
)
122
+
123
+ set_sec_axis(sec.axis , sc )
116
124
}
117
125
118
126
# ' @export
@@ -127,9 +135,10 @@ scale_x_datetime <- function(name = waiver(),
127
135
timezone = NULL ,
128
136
limits = NULL ,
129
137
expand = waiver(),
130
- position = " bottom" ) {
138
+ position = " bottom" ,
139
+ sec.axis = waiver()) {
131
140
132
- datetime_scale(
141
+ sc <- datetime_scale(
133
142
c(" x" , " xmin" , " xmax" , " xend" ),
134
143
" time" ,
135
144
name = name ,
@@ -146,6 +155,8 @@ scale_x_datetime <- function(name = waiver(),
146
155
expand = expand ,
147
156
position = position
148
157
)
158
+
159
+ set_sec_axis(sec.axis , sc )
149
160
}
150
161
151
162
@@ -161,9 +172,10 @@ scale_y_datetime <- function(name = waiver(),
161
172
timezone = NULL ,
162
173
limits = NULL ,
163
174
expand = waiver(),
164
- position = " left" ) {
175
+ position = " left" ,
176
+ sec.axis = waiver()) {
165
177
166
- datetime_scale(
178
+ sc <- datetime_scale(
167
179
c(" y" , " ymin" , " ymax" , " yend" ),
168
180
" time" ,
169
181
name = name ,
@@ -180,6 +192,8 @@ scale_y_datetime <- function(name = waiver(),
180
192
expand = expand ,
181
193
position = position
182
194
)
195
+
196
+ set_sec_axis(sec.axis , sc )
183
197
}
184
198
185
199
@@ -194,7 +208,8 @@ scale_x_time <- function(name = waiver(),
194
208
expand = waiver(),
195
209
oob = censor ,
196
210
na.value = NA_real_ ,
197
- position = " bottom" ) {
211
+ position = " bottom" ,
212
+ sec.axis = waiver()) {
198
213
199
214
scale_x_continuous(
200
215
name = name ,
@@ -206,7 +221,8 @@ scale_x_time <- function(name = waiver(),
206
221
oob = oob ,
207
222
na.value = na.value ,
208
223
position = position ,
209
- trans = scales :: hms_trans()
224
+ trans = scales :: hms_trans(),
225
+ sec.axis = sec.axis
210
226
)
211
227
}
212
228
@@ -221,7 +237,8 @@ scale_y_time <- function(name = waiver(),
221
237
expand = waiver(),
222
238
oob = censor ,
223
239
na.value = NA_real_ ,
224
- position = " left" ) {
240
+ position = " left" ,
241
+ sec.axis = waiver()) {
225
242
226
243
scale_y_continuous(
227
244
name = name ,
@@ -233,7 +250,8 @@ scale_y_time <- function(name = waiver(),
233
250
oob = oob ,
234
251
na.value = na.value ,
235
252
position = position ,
236
- trans = scales :: hms_trans()
253
+ trans = scales :: hms_trans(),
254
+ sec.axis = sec.axis
237
255
)
238
256
}
239
257
@@ -301,6 +319,7 @@ datetime_scale <- function(aesthetics, trans, palette,
301
319
# ' @usage NULL
302
320
# ' @export
303
321
ScaleContinuousDatetime <- ggproto(" ScaleContinuousDatetime" , ScaleContinuous ,
322
+ secondary.axis = waiver(),
304
323
timezone = NULL ,
305
324
transform = function (self , x ) {
306
325
tz <- attr(x , " tzone" )
@@ -312,15 +331,61 @@ ScaleContinuousDatetime <- ggproto("ScaleContinuousDatetime", ScaleContinuous,
312
331
},
313
332
map = function (self , x , limits = self $ get_limits()) {
314
333
self $ oob(x , limits )
334
+ },
335
+ break_info = function (self , range = NULL ) {
336
+ breaks <- ggproto_parent(ScaleContinuous , self )$ break_info(range )
337
+ if (! (is.waive(self $ secondary.axis ) || self $ secondary.axis $ empty())) {
338
+ self $ secondary.axis $ init(self )
339
+ breaks <- c(breaks , self $ secondary.axis $ break_info(breaks $ range , self ))
340
+ }
341
+ breaks
342
+ },
343
+ sec_name = function (self ) {
344
+ if (is.waive(self $ secondary.axis )) {
345
+ waiver()
346
+ } else {
347
+ self $ secondary.axis $ name
348
+ }
349
+ },
350
+ make_sec_title = function (self , title ) {
351
+ if (! is.waive(self $ secondary.axis )) {
352
+ self $ secondary.axis $ make_title(title )
353
+ } else {
354
+ ggproto_parent(ScaleContinuous , self )$ make_sec_title(title )
355
+ }
315
356
}
357
+
316
358
)
317
359
318
360
# ' @rdname ggplot2-ggproto
319
361
# ' @format NULL
320
362
# ' @usage NULL
321
363
# ' @export
322
364
ScaleContinuousDate <- ggproto(" ScaleContinuousDate" , ScaleContinuous ,
365
+ secondary.axis = waiver(),
323
366
map = function (self , x , limits = self $ get_limits()) {
324
367
self $ oob(x , limits )
368
+ },
369
+ break_info = function (self , range = NULL ) {
370
+ breaks <- ggproto_parent(ScaleContinuous , self )$ break_info(range )
371
+ if (! (is.waive(self $ secondary.axis ) || self $ secondary.axis $ empty())) {
372
+ self $ secondary.axis $ init(self )
373
+ breaks <- c(breaks , self $ secondary.axis $ break_info(breaks $ range , self ))
374
+ }
375
+ breaks
376
+ },
377
+ sec_name = function (self ) {
378
+ if (is.waive(self $ secondary.axis )) {
379
+ waiver()
380
+ } else {
381
+ self $ secondary.axis $ name
382
+ }
383
+ },
384
+ make_sec_title = function (self , title ) {
385
+ if (! is.waive(self $ secondary.axis )) {
386
+ self $ secondary.axis $ make_title(title )
387
+ } else {
388
+ ggproto_parent(ScaleContinuous , self )$ make_sec_title(title )
389
+ }
325
390
}
326
391
)
0 commit comments