在不替换比例的情况下修改现有 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”。其他帖子中提到的许多看似明显的策略在这种情况下不起作用:
p + scale_x_continuous(name = "newLabel")
更改标签 - 但它也更改限制。我可以通过调用 p + scale_x_continuous(name = "newLabel, limits = c(15, 30)")
来解决这个问题。但在实践中,我使用的 ggplot 对象可能是用 scale_x_continuous()
的许多参数创建的,我不想重复它们只是为了覆盖 x 轴标签。
p + xlab("newLabel")
不会替换标签。也就是说,xlab()
在这种情况下似乎没有任何效果。如果使用 xlab()
指定原始标签,它会起作用,但这里不是这种情况。
update_labels(p, list(x = "new x label"))
也不替换标签。
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 创建
我有一个 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”。其他帖子中提到的许多看似明显的策略在这种情况下不起作用:
p + scale_x_continuous(name = "newLabel")
更改标签 - 但它也更改限制。我可以通过调用p + scale_x_continuous(name = "newLabel, limits = c(15, 30)")
来解决这个问题。但在实践中,我使用的 ggplot 对象可能是用scale_x_continuous()
的许多参数创建的,我不想重复它们只是为了覆盖 x 轴标签。p + xlab("newLabel")
不会替换标签。也就是说,xlab()
在这种情况下似乎没有任何效果。如果使用xlab()
指定原始标签,它会起作用,但这里不是这种情况。update_labels(p, list(x = "new x label"))
也不替换标签。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 创建