Skip to content

Commit 3870c12

Browse files
authored
Fix guide merging when there are repeated labels (#3599, fixes #3573)
* add tests for guide merging * fix guide merging when there are duplicated labels
1 parent bad6f38 commit 3870c12

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

R/guide-legend.r

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,8 @@ guide_train.legend <- function(guide, scale, aesthetic = NULL) {
230230

231231
#' @export
232232
guide_merge.legend <- function(guide, new_guide) {
233-
guide$key <- merge(guide$key, new_guide$key, sort = FALSE)
233+
new_guide$key$.label <- NULL
234+
guide$key <- cbind(guide$key, new_guide$key)
234235
guide$override.aes <- c(guide$override.aes, new_guide$override.aes)
235236
if (any(duplicated(names(guide$override.aes)))) {
236237
warning("Duplicated override.aes is ignored.")

tests/testthat/test-guides.R

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,54 @@ test_that("Using non-position guides for position scales results in an informati
113113
expect_error(ggplot_gtable(built), "does not implement guide_transform()")
114114
})
115115

116+
test_that("guide merging for guide_legend() works as expected", {
117+
118+
merge_test_guides <- function(scale1, scale2) {
119+
scale1$guide <- guide_legend(direction = "vertical")
120+
scale2$guide <- guide_legend(direction = "vertical")
121+
scales <- scales_list()
122+
scales$add(scale1)
123+
scales$add(scale2)
124+
125+
guide_list <- guides_train(scales, theme = theme_gray(), labels = labs(), guides = guides())
126+
guides_merge(guide_list)
127+
}
128+
129+
different_limits <- merge_test_guides(
130+
scale_colour_discrete(limits = c("a", "b", "c", "d")),
131+
scale_linetype_discrete(limits = c("a", "b", "c"))
132+
)
133+
expect_length(different_limits, 2)
134+
135+
same_limits <- merge_test_guides(
136+
scale_colour_discrete(limits = c("a", "b", "c")),
137+
scale_linetype_discrete(limits = c("a", "b", "c"))
138+
)
139+
expect_length(same_limits, 1)
140+
expect_equal(same_limits[[1]]$key$.label, c("a", "b", "c"))
141+
142+
same_labels_different_limits <- merge_test_guides(
143+
scale_colour_discrete(limits = c("a", "b", "c")),
144+
scale_linetype_discrete(limits = c("one", "two", "three"), labels = c("a", "b", "c"))
145+
)
146+
expect_length(same_labels_different_limits, 1)
147+
expect_equal(same_labels_different_limits[[1]]$key$.label, c("a", "b", "c"))
148+
149+
same_labels_different_scale <- merge_test_guides(
150+
scale_colour_continuous(limits = c(0, 4), breaks = 1:3, labels = c("a", "b", "c")),
151+
scale_linetype_discrete(limits = c("a", "b", "c"))
152+
)
153+
expect_length(same_labels_different_scale, 1)
154+
expect_equal(same_labels_different_scale[[1]]$key$.label, c("a", "b", "c"))
155+
156+
repeated_identical_labels <- merge_test_guides(
157+
scale_colour_discrete(limits = c("one", "two", "three"), labels = c("label1", "label1", "label2")),
158+
scale_linetype_discrete(limits = c("1", "2", "3"), labels = c("label1", "label1", "label2"))
159+
)
160+
expect_length(repeated_identical_labels, 1)
161+
expect_equal(repeated_identical_labels[[1]]$key$.label, c("label1", "label1", "label2"))
162+
})
163+
116164
# Visual tests ------------------------------------------------------------
117165

118166
test_that("axis guides are drawn correctly", {

0 commit comments

Comments
 (0)