Skip to content

Commit 5964f7a

Browse files
authored
Ensure boxplot key can be drawn without params (#6192)
* fallback for `staplewidth` in boxplot key * add test * add comment * test for completeness too
1 parent c9fbb28 commit 5964f7a

File tree

3 files changed

+130
-1
lines changed

3 files changed

+130
-1
lines changed

R/legend-draw.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ draw_key_boxplot <- function(data, params, size) {
128128
lwd = params$box_gp$linewidth
129129
)
130130

131-
staple_size <- 0.5 + c(0.375, -0.375) * params$staplewidth
131+
staple_size <- 0.5 + c(0.375, -0.375) * (params$staplewidth %||% 0)
132132
staple <- gg_par(
133133
col = params$staple_gp$colour,
134134
lty = params$staple_gp$linetype,
Lines changed: 63 additions & 0 deletions
Loading

tests/testthat/test-legend-draw.R

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
test_that("all keys can be drawn without 'params'", {
3+
4+
params <- list()
5+
size <- convertUnit(calc_element("legend.key.size", theme_gray()), "cm", valueOnly = TRUE)
6+
size <- size * 10 # cm to mm
7+
8+
# Render every key
9+
# If we're to develop new legend keys, we can keep appending this pattern
10+
# for new keys and layout should adjust automatically.
11+
# This is also an implicit test whether the key can be constructed without errors
12+
keys <- list(
13+
point = draw_key_point(GeomPoint$use_defaults(NULL), params, size),
14+
abline = draw_key_abline(GeomAbline$use_defaults(NULL), params, size),
15+
rect = draw_key_rect(GeomRect$use_defaults(NULL), params, size),
16+
polygon = draw_key_polygon(GeomPolygon$use_defaults(NULL), params, size),
17+
blank = draw_key_blank(GeomBlank$use_defaults(NULL), params, size),
18+
boxplot = draw_key_boxplot(GeomBoxplot$use_defaults(NULL), params, size),
19+
crossbar = draw_key_crossbar(GeomCrossbar$use_defaults(NULL), params, size),
20+
path = draw_key_path(GeomPath$use_defaults(NULL), params, size),
21+
vpath = draw_key_vpath(GeomPath$use_defaults(NULL), params, size),
22+
dotplot = draw_key_dotplot(GeomDotplot$use_defaults(NULL), params, size),
23+
linerange = draw_key_linerange(GeomLinerange$use_defaults(NULL), params, size),
24+
pointrange = draw_key_pointrange(GeomPointrange$use_defaults(NULL), params, size),
25+
smooth = draw_key_smooth(GeomSmooth$use_defaults(NULL), params, size),
26+
text = draw_key_text(GeomText$use_defaults(NULL), params, size),
27+
label = draw_key_label(GeomLabel$use_defaults(NULL), params, size),
28+
vline = draw_key_vline(GeomVline$use_defaults(NULL), params, size),
29+
timeseries = draw_key_timeseries(GeomPath$use_defaults(NULL), params, size)
30+
)
31+
32+
# Test that we've covered all exported keys above
33+
nse <- getNamespaceExports(asNamespace("ggplot2"))
34+
nse <- grep("^draw_key", nse, value = TRUE)
35+
nse <- gsub("^draw_key_", "", nse)
36+
expect_in(nse, names(keys))
37+
38+
# Add title to every key
39+
template <- gtable(width = unit(size, "mm"), heights = unit(c(1, size), c("lines", "mm")))
40+
keys <- Map(
41+
function(key, name) {
42+
text <- textGrob(name, gp = gpar(fontsize = 8))
43+
gtable_add_grob(template, list(text, key), t = 1:2, l = 1, clip = "off")
44+
},
45+
key = keys, name = names(keys)
46+
)
47+
48+
# Set layout
49+
n <- length(keys)
50+
nrow <- ceiling(n / 5)
51+
ncol <- ceiling(n / nrow)
52+
mtx <- matrix(list(zeroGrob()), nrow = nrow, ncol = ncol)
53+
mtx[seq_along(keys)] <- keys
54+
55+
# Render as gtable
56+
gt <- gtable_matrix(
57+
name = "layout", grobs = mtx,
58+
widths = unit(rep(size, ncol(mtx)), "mm"),
59+
heights = unit(rep(size, nrow(mtx)), "mm") + unit(1, "lines"),
60+
clip = "off"
61+
)
62+
gt <- gtable_add_col_space(gt, unit(1, "cm"))
63+
gt <- gtable_add_row_space(gt, unit(1, "cm"))
64+
65+
expect_doppelganger("all legend keys", gt)
66+
})

0 commit comments

Comments
 (0)