-
Notifications
You must be signed in to change notification settings - Fork 0
/
grob-transform.R
132 lines (103 loc) · 3.43 KB
/
grob-transform.R
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
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Rotate a grob or viewport
#'
#' @param obj grob or viewport
#' @param angle rotation angle in degrees
#'
#' @import grid
#' @export
#'
#' @family transformations
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
igt_rotate <- function(obj, angle) {
if (is_grob(obj)) {
if (is.null(obj$vp)) {
obj$vp <- vpc()
}
obj$vp$angle <- obj$vp$angle + angle
} else if (is_viewport(obj)) {
obj$angle <- obj$angle + angle
} else {
stop("must be grob or viewport")
}
grob_auto_name(obj)
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Translate a grob or viewport
#'
#' @param obj grob or viewport
#' @param x,y translation
#' @param default.units 'npc'
#'
#' @import grid
#' @export
#'
#' @family transformations
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
igt_translate <- function(obj, x = 0, y = 0, default.units = getOption("ingrid.default.units", 'npc')) {
x <- make_unit(x, default.units)
y <- make_unit(y, default.units)
if (is_grob(obj)) {
if (is.null(obj$vp)) {
obj$vp <- vpc()
}
obj$vp$x <- obj$vp$x + x
obj$vp$y <- obj$vp$y + y
} else if (is_viewport(obj)) {
obj$x <- obj$x + x
obj$y <- obj$y + y
} else {
stop("must be grob or viewport")
}
grob_auto_name(obj)
}
gp_arg_names <- c('col', 'fill', 'alpha', 'lty', 'lwd', 'lex', 'lineend',
'linejoin', 'linemitre', 'fontsize', 'cex', 'fontfamily',
'fontface', 'lineheight')
vp_arg_names <- c('mask', 'clip', 'layout', 'layout.pos.row', 'layout.pos.col')
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Update a grob/viewport
#'
#' Note: No checking is currently done on the validity of these parameters.
#' Use with caution!
#'
#' @param obj grob or viewport
#' @param ... named arguments e.g. \code{fill = 'red'}
#'
#' @import grid
#' @export
#'
#' @family transformations
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
igt_update <- function(obj, ...) {
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Sanity check all updated arguments are named
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
args <- list(...)
if (is.null(names(args)) || any(names(args) == '')) {
stop("igt_update(): All arguments must be named")
}
if (is_grob(obj)) {
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Update values in the graphical parameters
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (is.null(obj$gp)) { obj$gp <- gp()}
gp_arg_names <- intersect(gp_arg_names, names(args))
for (gp_name in gp_arg_names) {
obj$gp[[gp_name]] <- args[[gp_name]]
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Update values in the viewport
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (is.null(obj$vp)) { obj$vp <- vpc()}
vp_arg_names <- intersect(vp_arg_names, names(args))
for (vp_name in vp_arg_names) {
obj$vp[[vp_name]] <- args[[vp_name]]
}
}
arg_names <- setdiff(names(args), c(gp_arg_names, vp_arg_names))
for (arg_name in arg_names) {
obj[[arg_name]] <- args[[arg_name]]
}
grob_auto_name(obj)
}