1
- # ' Key drawing functions
1
+ # ' Key glyphs for legends
2
2
# '
3
- # ' Each Geom has an associated function that draws the key when the geom needs
4
- # ' to be displayed in a legend. These are the options built into ggplot2.
3
+ # ' Each geom has an associated function that draws the key when the geom needs
4
+ # ' to be displayed in a legend. These functions are called `draw_key_*()`, where
5
+ # ' `*` stands for the name of the respective key glyph. The key glyphs can be
6
+ # ' customized for individual geoms by providing a geom with the `key_glyph`
7
+ # ' argument (see [`layer()`] or examples below.)
5
8
# '
6
9
# ' @return A grid grob.
7
10
# ' @param data A single row data frame containing the scaled aesthetics to
8
11
# ' display in this key
9
12
# ' @param params A list of additional parameters supplied to the geom.
10
13
# ' @param size Width and height of key in mm.
11
- # ' @keywords internal
14
+ # ' @examples
15
+ # ' p <- ggplot(economics, aes(date, psavert, color = "savings rate"))
16
+ # ' # key glyphs can be specified by their name
17
+ # ' p + geom_line(key_glyph = "timeseries")
18
+ # '
19
+ # ' # key glyphs can be specified via their drawing function
20
+ # ' p + geom_line(key_glyph = draw_key_rect)
12
21
# ' @name draw_key
13
22
NULL
14
23
15
24
# ' @export
16
25
# ' @rdname draw_key
17
26
draw_key_point <- function (data , params , size ) {
18
- if (is.character(data $ shape )) {
27
+ if (is.null(data $ shape )) {
28
+ data $ shape <- 19
29
+ } else if (is.character(data $ shape )) {
19
30
data $ shape <- translate_shape_string(data $ shape )
20
31
}
21
32
22
33
pointsGrob(0.5 , 0.5 ,
23
34
pch = data $ shape ,
24
35
gp = gpar(
25
- col = alpha(data $ colour , data $ alpha ),
26
- fill = alpha(data $ fill , data $ alpha ),
27
- fontsize = data $ size * .pt + data $ stroke * .stroke / 2 ,
28
- lwd = data $ stroke * .stroke / 2
36
+ col = alpha(data $ colour % || % " black " , data $ alpha ),
37
+ fill = alpha(data $ fill % || % " black " , data $ alpha ),
38
+ fontsize = ( data $ size % || % 1.5 ) * .pt + ( data $ stroke % || % 0.5 ) * .stroke / 2 ,
39
+ lwd = ( data $ stroke % || % 0.5 ) * .stroke / 2
29
40
)
30
41
)
31
42
}
@@ -35,9 +46,9 @@ draw_key_point <- function(data, params, size) {
35
46
draw_key_abline <- function (data , params , size ) {
36
47
segmentsGrob(0 , 0 , 1 , 1 ,
37
48
gp = gpar(
38
- col = alpha(data $ colour , data $ alpha ),
39
- lwd = data $ size * .pt ,
40
- lty = data $ linetype ,
49
+ col = alpha(data $ colour % || % data $ fill % || % " black " , data $ alpha ),
50
+ lwd = ( data $ size % || % 0.5 ) * .pt ,
51
+ lty = data $ linetype % || % 1 ,
41
52
lineend = " butt"
42
53
)
43
54
)
@@ -48,22 +59,26 @@ draw_key_abline <- function(data, params, size) {
48
59
draw_key_rect <- function (data , params , size ) {
49
60
rectGrob(gp = gpar(
50
61
col = NA ,
51
- fill = alpha(data $ fill , data $ alpha ),
52
- lty = data $ linetype
62
+ fill = alpha(data $ fill % || % data $ colour % || % " grey20 " , data $ alpha ),
63
+ lty = data $ linetype % || % 1
53
64
))
54
65
}
55
66
# ' @export
56
67
# ' @rdname draw_key
57
68
draw_key_polygon <- function (data , params , size ) {
69
+ if (is.null(data $ size )) {
70
+ data $ size <- 0.5
71
+ }
72
+
58
73
lwd <- min(data $ size , min(size ) / 4 )
59
74
60
75
rectGrob(
61
76
width = unit(1 , " npc" ) - unit(lwd , " mm" ),
62
77
height = unit(1 , " npc" ) - unit(lwd , " mm" ),
63
78
gp = gpar(
64
- col = data $ colour ,
65
- fill = alpha(data $ fill , data $ alpha ),
66
- lty = data $ linetype ,
79
+ col = data $ colour % || % NA ,
80
+ fill = alpha(data $ fill % || % " grey20 " , data $ alpha ),
81
+ lty = data $ linetype % || % 1 ,
67
82
lwd = lwd * .pt ,
68
83
linejoin = " mitre"
69
84
))
@@ -84,10 +99,10 @@ draw_key_boxplot <- function(data, params, size) {
84
99
rectGrob(height = 0.5 , width = 0.75 ),
85
100
linesGrob(c(0.125 , 0.875 ), 0.5 ),
86
101
gp = gpar(
87
- col = data $ colour ,
88
- fill = alpha(data $ fill , data $ alpha ),
89
- lwd = data $ size * .pt ,
90
- lty = data $ linetype
102
+ col = data $ colour % || % " grey20 " ,
103
+ fill = alpha(data $ fill % || % " white " , data $ alpha ),
104
+ lwd = ( data $ size % || % 0.5 ) * .pt ,
105
+ lty = data $ linetype % || % 1
91
106
)
92
107
)
93
108
}
@@ -99,24 +114,28 @@ draw_key_crossbar <- function(data, params, size) {
99
114
rectGrob(height = 0.5 , width = 0.75 ),
100
115
linesGrob(c(0.125 , 0.875 ), 0.5 ),
101
116
gp = gpar(
102
- col = data $ colour ,
103
- fill = alpha(data $ fill , data $ alpha ),
104
- lwd = data $ size * .pt ,
105
- lty = data $ linetype
117
+ col = data $ colour % || % " grey20 " ,
118
+ fill = alpha(data $ fill % || % " white " , data $ alpha ),
119
+ lwd = ( data $ size % || % 0.5 ) * .pt ,
120
+ lty = data $ linetype % || % 1
106
121
)
107
122
)
108
123
}
109
124
110
125
# ' @export
111
126
# ' @rdname draw_key
112
127
draw_key_path <- function (data , params , size ) {
113
- data $ linetype [is.na(data $ linetype )] <- 0
128
+ if (is.null(data $ linetype )) {
129
+ data $ linetype <- 0
130
+ } else {
131
+ data $ linetype [is.na(data $ linetype )] <- 0
132
+ }
114
133
115
134
segmentsGrob(0.1 , 0.5 , 0.9 , 0.5 ,
116
135
gp = gpar(
117
- col = alpha(data $ colour , data $ alpha ),
118
- lwd = data $ size * .pt ,
119
- lty = data $ linetype ,
136
+ col = alpha(data $ colour % || % data $ fill % || % " black " , data $ alpha ),
137
+ lwd = ( data $ size % || % 0.5 ) * .pt ,
138
+ lty = data $ linetype % || % 1 ,
120
139
lineend = " butt"
121
140
),
122
141
arrow = params $ arrow
@@ -128,9 +147,9 @@ draw_key_path <- function(data, params, size) {
128
147
draw_key_vpath <- function (data , params , size ) {
129
148
segmentsGrob(0.5 , 0.1 , 0.5 , 0.9 ,
130
149
gp = gpar(
131
- col = alpha(data $ colour , data $ alpha ),
132
- lwd = data $ size * .pt ,
133
- lty = data $ linetype ,
150
+ col = alpha(data $ colour % || % data $ fill % || % " black " , data $ alpha ),
151
+ lwd = ( data $ size % || % 0.5 ) * .pt ,
152
+ lty = data $ linetype % || % 1 ,
134
153
lineend = " butt"
135
154
),
136
155
arrow = params $ arrow
@@ -143,8 +162,8 @@ draw_key_dotplot <- function(data, params, size) {
143
162
pointsGrob(0.5 , 0.5 , size = unit(.5 , " npc" ),
144
163
pch = 21 ,
145
164
gp = gpar(
146
- col = alpha(data $ colour , data $ alpha ),
147
- fill = alpha(data $ fill , data $ alpha )
165
+ col = alpha(data $ colour % || % " black " , data $ alpha ),
166
+ fill = alpha(data $ fill % || % " black " , data $ alpha )
148
167
)
149
168
)
150
169
}
@@ -154,14 +173,14 @@ draw_key_dotplot <- function(data, params, size) {
154
173
draw_key_pointrange <- function (data , params , size ) {
155
174
grobTree(
156
175
draw_key_vpath(data , params , size ),
157
- draw_key_point(transform(data , size = data $ size * 4 ), params )
176
+ draw_key_point(transform(data , size = ( data $ size % || % 1.5 ) * 4 ), params )
158
177
)
159
178
}
160
179
161
180
# ' @export
162
181
# ' @rdname draw_key
163
182
draw_key_smooth <- function (data , params , size ) {
164
- data $ fill <- alpha(data $ fill , data $ alpha )
183
+ data $ fill <- alpha(data $ fill % || % " grey60 " , data $ alpha )
165
184
data $ alpha <- 1
166
185
167
186
grobTree(
@@ -174,14 +193,14 @@ draw_key_smooth <- function(data, params, size) {
174
193
# ' @rdname draw_key
175
194
draw_key_text <- function (data , params , size ) {
176
195
if (is.null(data $ label )) data $ label <- " a"
177
-
196
+
178
197
textGrob(data $ label , 0.5 , 0.5 ,
179
- rot = data $ angle ,
198
+ rot = data $ angle % || % 0 ,
180
199
gp = gpar(
181
- col = alpha(data $ colour , data $ alpha ),
182
- fontfamily = data $ family ,
183
- fontface = data $ fontface ,
184
- fontsize = data $ size * .pt
200
+ col = alpha(data $ colour % || % data $ fill % || % " black " , data $ alpha ),
201
+ fontfamily = data $ family % || % " " ,
202
+ fontface = data $ fontface % || % 1 ,
203
+ fontsize = ( data $ size % || % 3.88 ) * .pt
185
204
)
186
205
)
187
206
}
@@ -200,9 +219,30 @@ draw_key_label <- function(data, params, size) {
200
219
draw_key_vline <- function (data , params , size ) {
201
220
segmentsGrob(0.5 , 0 , 0.5 , 1 ,
202
221
gp = gpar(
203
- col = alpha(data $ colour , data $ alpha ),
204
- lwd = data $ size * .pt ,
205
- lty = data $ linetype ,
222
+ col = alpha(data $ colour %|| % data $ fill %|| % " black" , data $ alpha ),
223
+ lwd = (data $ size %|| % 0.5 ) * .pt ,
224
+ lty = data $ linetype %|| % 1 ,
225
+ lineend = " butt"
226
+ )
227
+ )
228
+ }
229
+
230
+ # ' @export
231
+ # ' @rdname draw_key
232
+ draw_key_timeseries <- function (data , params , size ) {
233
+ if (is.null(data $ linetype )) {
234
+ data $ linetype <- 0
235
+ } else {
236
+ data $ linetype [is.na(data $ linetype )] <- 0
237
+ }
238
+
239
+ grid :: linesGrob(
240
+ x = c(0 , 0.4 , 0.6 , 1 ),
241
+ y = c(0.1 , 0.6 , 0.4 , 0.9 ),
242
+ gp = gpar(
243
+ col = alpha(data $ colour %|| % data $ fill %|| % " black" , data $ alpha ),
244
+ lwd = (data $ size %|| % 0.5 ) * .pt ,
245
+ lty = data $ linetype %|| % 1 ,
206
246
lineend = " butt"
207
247
)
208
248
)
0 commit comments