在不替换比例的情况下修改现有 ggplot 对象中的比例

modify scale in existing ggplot object without replacing the scale

我有一个 ggplot 对象。它有一个由 scales_x_continuous() 创建的 x 轴标签。在不重新创建绘图且不更改传递给 scale_x_continuous() 的任何其他参数的情况下,我想更改 x 轴标签。我该怎么做?

有很多关于在创建后更新 ggplot 对象的 SO 帖子。但据我所知,这些帖子中的解决方案不适用于这种特定情况。为了修正想法,这里有一个小例子:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + 
  geom_point() + 
  scale_x_continuous(name = "oldLabel", limits = c(15, 30))

我想在不覆盖 limits 参数的情况下将 x 轴标签从“oldLabel”更改为“newLabel”。其他帖子中提到的许多看似明显的策略在这种情况下不起作用:

  1. p + scale_x_continuous(name = "newLabel") 更改标签 - 但它也更改限制。我可以通过调用 p + scale_x_continuous(name = "newLabel, limits = c(15, 30)") 来解决这个问题。但在实践中,我使用的 ggplot 对象可能是用 scale_x_continuous() 的许多参数创建的,我不想重复它们只是为了覆盖 x 轴标签。

  2. p + xlab("newLabel") 不会替换标签。也就是说,xlab() 在这种情况下似乎没有任何效果。如果使用 xlab() 指定原始标签,它会起作用,但这里不是这种情况。

  3. update_labels(p, list(x = "new x label")) 也不替换标签。

  4. ggplot_build() 似乎也没有效果,至少我一直在使用它:

library(gridExtra)
tmp <- ggplot_build(p)
tmp$layout$panel_params[[1]]$x$name     <- "newLabel"
tmp$layout$panel_params[[1]]$x.sec$name <- "newLabel"
grid.arrange(ggplot_gtable(tmp))

您需要更新绘图本身内 x 比例对象的 name 参数(而不是驻留在 ggplot 构建对象的 layout 中的副本)。

这是一个完整的代表:

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) + 
  geom_point() + 
  scale_x_continuous(name = "oldLabel", limits = c(15, 30))

p
#> Warning: Removed 9 rows containing missing values (geom_point).


p$scales$scales[[1]]$name <- "newLabel"

p
#> Warning: Removed 9 rows containing missing values (geom_point).

reprex package (v0.3.0)

于 2020-09-01 创建