为什么 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 =))?
上下文: 有时我只需要更改绘图的标签(例如更改语言)但我不想重新制作整个情节,因为在某些情况下代码可能会很长。
问题:他们至少有两种定义美学标签的方法:
- 使用函数
ggpot2::labs(x = ..., y = ...)
并且,
- 使用尺度函数的
name
参数 ggplots::scale_*_*(name = ...)
根据下面的示例,似乎对于图 p
,p + 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 个这样的比例,但它是理论上的可能性。)
- 指南标题。
- 秤名称。
labs()
函数。
- 在
aes()
. 中捕获的表达式
大部分消歧发生在 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 预定义比例的图,这应该没问题(除非他们在指南中设置了特定的选项)。
上下文: 有时我只需要更改绘图的标签(例如更改语言)但我不想重新制作整个情节,因为在某些情况下代码可能会很长。
问题:他们至少有两种定义美学标签的方法:
- 使用函数
ggpot2::labs(x = ..., y = ...)
并且, - 使用尺度函数的
name
参数ggplots::scale_*_*(name = ...)
根据下面的示例,似乎对于图 p
,p + 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 个这样的比例,但它是理论上的可能性。)
- 指南标题。
- 秤名称。
labs()
函数。- 在
aes()
. 中捕获的表达式
大部分消歧发生在 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 预定义比例的图,这应该没问题(除非他们在指南中设置了特定的选项)。