为什么 gplot2::labs() overwrite/update scales 函数的名称参数(即 ggplot2::scale_*_(name =))没有?

Why doesn't gplot2::labs() overwrite/update the name argument of scales functions (i.e. ggplot2::scale_*_(name =))?

上下文: 有时我只需要更改绘图的标签(例如更改语言)但我不想重新制作整个情节,因为在某些情况下代码可能会很长。

问题:他们至少有两种定义美学标签的方法:

  1. 使用函数 ggpot2::labs(x = ..., y = ...) 并且,
  2. 使用尺度函数的 name 参数 ggplots::scale_*_*(name = ...)

根据下面的示例,似乎对于图 pp + labs() 可以覆盖用 labs() 函数定义的实验室,但不能覆盖用 [=23= 定义的实验室].

问题:如何避免这种行为?是bug还是我做错了什么?

示例:

这是按预期工作的:

library(ggplot2)
# This is working as expected
p1 <- ggplot(data = iris, aes(x = Sepal.Width, y = Petal.Width)) +
  scale_x_continuous() +
  scale_y_continuous() +
  labs(x = "A name",
       y = "Another name")
p1
# trying to change the labs without making the plot again
p1 + labs(
  x = "The new x title",
  y = "The new y title"
)

虽然这不是:

library(ggplot2)
# This is not working
p2 <- ggplot(data = iris, aes(x = Sepal.Width, y = Petal.Width)) +
  scale_x_continuous(name = "A name") +
  scale_y_continuous(name = "Another name")
p2
p2 + labs(
  x = "The new x title",
  y = "The nex y title"
)

这只是在解释正在发生的事情。有多种方法可以在绘图中设置标签,它们具有不同的优先级。以下是从高到低的优先级。

(0。在某些比例扩展中,make_title() 方法可以被覆盖。这通常不适用于绝大多数比例。我知道只有 0 个这样的比例,但它是理论上的可能性。)

  1. 指南标题。
  2. 秤名称。
  3. labs() 函数。
  4. aes().
  5. 中捕获的表达式

大部分消歧发生在 ggplot2 源代码的 this line 中,其中解决了优先级 1-3。 labs() 函数本质上所做的是从捕获的表达式中覆盖自动生成的标签,从而使 (3) 优先于 (4)。

尝试注释掉下面情节的某些部分以仔细检查自己。

library(ggplot2)

df <- iris
names(df)[1] <- "Last Priority"

ggplot(df, aes(`Last Priority`, Sepal.Width)) +
  scale_x_continuous(
    name  = "Second Priority",
    guide = guide_axis(title = "First priority")
  ) +
  labs(x = "Third Priority")

因此,覆盖 x-axis 标题的最佳做法是使用:

plot + guides(x = guide_axis(title = "My new title"))

由于坐标轴指南通常是 guide_axis()guide_none(),因此您在大多数情况下都可以正常工作(绘图没有坐标轴时除外)。此外,如果你有一个函数生成一个带有 x 预定义比例的图,这应该没问题(除非他们在指南中设置了特定的选项)。