From 77a8140e538024379bc4e8cd57137f5f5644d704 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Mon, 6 Jan 2025 14:56:48 +0100 Subject: [PATCH 1/6] Prevent `NA` linetype --- R/utilities-grid.R | 3 +++ 1 file changed, 3 insertions(+) diff --git a/R/utilities-grid.R b/R/utilities-grid.R index c231f0b279..a935d5b38f 100644 --- a/R/utilities-grid.R +++ b/R/utilities-grid.R @@ -41,6 +41,9 @@ gg_par <- function(..., stroke = NULL, pointsize = NULL) { stroke[is.na(stroke)] <- 0 args$fontsize <- pointsize * .pt + stroke * .stroke / 2 } + if (!is.null(args$lty) && anyNA(args$lty)) { + args$lty[is.na(args$lty)] <- if (is.character(args$lty)) "blank" else 0 + } inject(gpar(!!!args)) } From 6f92145e422416446de86138465e9420fc31b9c1 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Mon, 6 Jan 2025 14:58:39 +0100 Subject: [PATCH 2/6] add news bullet --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index dd574ac1aa..51e3f98d8a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # ggplot2 (development version) +* `linetype = NA` is now interpreted to mean 'no line' instead of raising errors + (@teunbrand, #6269). * `guide_*()` can now accept two inside legend theme elements: `legend.position.inside` and `legend.justification.inside`, allowing inside legends to be placed at different positions. Only inside legends with the same From 9ccac095fe2c8db09cc104a4cc51bedb0485c8f2 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 28 Jan 2025 09:25:20 +0100 Subject: [PATCH 3/6] remove contingencies handled by `gg_par()` --- R/legend-draw.R | 4 ---- 1 file changed, 4 deletions(-) diff --git a/R/legend-draw.R b/R/legend-draw.R index d08c6c6c93..23e46ce3d4 100644 --- a/R/legend-draw.R +++ b/R/legend-draw.R @@ -203,8 +203,6 @@ draw_key_crossbar <- function(data, params, size) { draw_key_path <- function(data, params, size) { if (is.null(data$linetype)) { data$linetype <- 0 - } else { - data$linetype[is.na(data$linetype)] <- 0 } grob <- segmentsGrob(0.1, 0.5, 0.9, 0.5, gp = gg_par( @@ -391,8 +389,6 @@ draw_key_vline <- function(data, params, size) { draw_key_timeseries <- function(data, params, size) { if (is.null(data$linetype)) { data$linetype <- 0 - } else { - data$linetype[is.na(data$linetype)] <- 0 } grid::linesGrob( From ec32b8018fae6674e25db69dd1db32d03e6ed8d4 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 28 Jan 2025 15:54:23 +0100 Subject: [PATCH 4/6] add linetype graphic to documentation --- R/scale-linetype.R | 8 +++++ man/figures/linetype_table.pdf | Bin 0 -> 4298 bytes man/figures/linetype_table.svg | 63 +++++++++++++++++++++++++++++++++ man/scale_linetype.Rd | 7 ++++ 4 files changed, 78 insertions(+) create mode 100644 man/figures/linetype_table.pdf create mode 100644 man/figures/linetype_table.svg diff --git a/R/scale-linetype.R b/R/scale-linetype.R index 8f8c62e30e..54883aed02 100644 --- a/R/scale-linetype.R +++ b/R/scale-linetype.R @@ -9,6 +9,14 @@ #' @inheritDotParams discrete_scale -expand -position -na.value -scale_name -palette #' @param na.value The linetype to use for `NA` values. #' @rdname scale_linetype +#' @details +#' Lines can be referred to by number, name or hex code. Contrary to base R +#' graphics, `NA`s are interpreted as blanks. +#' +#' \if{html}{\figure{linetype_table.svg}{Named linetypes by number and name}} +#' \if{latex}{\figure{linetype_table.pdf}} +#' +#' #' @seealso #' The documentation for [differentiation related aesthetics][aes_linetype_size_shape]. #' diff --git a/man/figures/linetype_table.pdf b/man/figures/linetype_table.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29710c0883c5b647f0eb75eb5fa4e1ab5b89f3f1 GIT binary patch literal 4298 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 literal 0 HcmV?d00001 diff --git a/man/figures/linetype_table.svg b/man/figures/linetype_table.svg new file mode 100644 index 0000000000..9ea0a7ea82 --- /dev/null +++ b/man/figures/linetype_table.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + +"blank"/NA +"solid" +"dashed" +"dotted" +"dotdash" +"longdash" +"twodash" +0/NA +1 +2 +3 +4 +5 +6 +"44" +"13" +"1343" +"73" +"2262" + + + + + + + + +Number +Name +Hex code +Display + + diff --git a/man/scale_linetype.Rd b/man/scale_linetype.Rd index cc5fa67cb4..b089a55cc3 100644 --- a/man/scale_linetype.Rd +++ b/man/scale_linetype.Rd @@ -86,6 +86,13 @@ University of Manchester. Continuous values can not be mapped to line types unless \code{scale_linetype_binned()} is used. Still, as linetypes has no inherent order, this use is not advised. } +\details{ +Lines can be referred to by number, name or hex code. Contrary to base R +graphics, \code{NA}s are interpreted as blanks. + +\if{html}{\figure{linetype_table.svg}{Named linetypes by number and name}} +\if{latex}{\figure{linetype_table.pdf}} +} \examples{ base <- ggplot(economics_long, aes(date, value01)) base + geom_line(aes(group = variable)) From 7ec4ad7273eadd4566946303fcbf3d2082752a11 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 28 Jan 2025 16:15:31 +0100 Subject: [PATCH 5/6] remove `na.value` as an argument --- R/scale-linetype.R | 6 ++---- man/scale_linetype.Rd | 20 +++++--------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/R/scale-linetype.R b/R/scale-linetype.R index 5a43a2ec7e..c910f27b03 100644 --- a/R/scale-linetype.R +++ b/R/scale-linetype.R @@ -43,22 +43,20 @@ #' scale_linetype_identity() + #' facet_grid(linetype ~ .) + #' theme_void(20) -scale_linetype <- function(name = waiver(), ..., na.value = NA, aesthetics = "linetype") { +scale_linetype <- function(name = waiver(), ..., aesthetics = "linetype") { discrete_scale( aesthetics, name = name, palette = NULL, - na.value = na.value, ... ) } #' @rdname scale_linetype #' @export -scale_linetype_binned <- function(name = waiver(), ..., na.value = NA, aesthetics = "linetype") { +scale_linetype_binned <- function(name = waiver(), ..., aesthetics = "linetype") { binned_scale( aesthetics, name = name, palette = NULL, - na.value = na.value, ... ) } diff --git a/man/scale_linetype.Rd b/man/scale_linetype.Rd index fd6b84cd97..9dc61e2f11 100644 --- a/man/scale_linetype.Rd +++ b/man/scale_linetype.Rd @@ -7,23 +7,13 @@ \alias{scale_linetype_discrete} \title{Scale for line patterns} \usage{ -scale_linetype(name = waiver(), ..., na.value = NA, aesthetics = "linetype") +scale_linetype(name = waiver(), ..., aesthetics = "linetype") -scale_linetype_binned( - name = waiver(), - ..., - na.value = NA, - aesthetics = "linetype" -) +scale_linetype_binned(name = waiver(), ..., aesthetics = "linetype") scale_linetype_continuous(...) -scale_linetype_discrete( - name = waiver(), - ..., - na.value = NA, - aesthetics = "linetype" -) +scale_linetype_discrete(name = waiver(), ..., aesthetics = "linetype") } \arguments{ \item{name}{The name of the scale. Used as the axis or legend title. If @@ -89,9 +79,9 @@ notation. \item{\code{super}}{The super class to use for the constructed scale} }} -\item{na.value}{The linetype to use for \code{NA} values.} - \item{aesthetics}{The names of the aesthetics that this scale works with.} + +\item{na.value}{The linetype to use for \code{NA} values.} } \description{ Default line types based on a set supplied by Richard Pearson, From db1d0cd235cc6e9ed68e6137485bf48fa18f51e7 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 28 Jan 2025 16:44:03 +0100 Subject: [PATCH 6/6] fix dumb mistake --- R/scale-linetype.R | 1 - man/scale_linetype.Rd | 2 -- 2 files changed, 3 deletions(-) diff --git a/R/scale-linetype.R b/R/scale-linetype.R index c910f27b03..f3d48aa4c5 100644 --- a/R/scale-linetype.R +++ b/R/scale-linetype.R @@ -7,7 +7,6 @@ #' #' @inheritParams discrete_scale #' @inheritDotParams discrete_scale -expand -position -na.value -scale_name -palette -#' @param na.value The linetype to use for `NA` values. #' @rdname scale_linetype #' @details #' Lines can be referred to by number, name or hex code. Contrary to base R diff --git a/man/scale_linetype.Rd b/man/scale_linetype.Rd index 9dc61e2f11..5c6e9a691f 100644 --- a/man/scale_linetype.Rd +++ b/man/scale_linetype.Rd @@ -80,8 +80,6 @@ notation. }} \item{aesthetics}{The names of the aesthetics that this scale works with.} - -\item{na.value}{The linetype to use for \code{NA} values.} } \description{ Default line types based on a set supplied by Richard Pearson,