面对因式变量和 geom_hline / geom_vline
Facetting with factorised variables and geom_hline / geom_vline
考虑这段代码:
require(ggplot2)
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ cyl) ## works
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ factor(cyl)) ## does not work
# Error in factor(cyl) : object 'cyl' not found
# removing geom_hline: works again.
Google帮我找了一个debug,即将intercept
包装成aes
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(aes(yintercept = 3)) +
facet_grid(~ factor(cyl)) # works
# R version 3.4.3 (2017-11-30)
# ggplot2_2.2.1
Hadley writes here作为变量的功能需要在每一层。 (这对我来说听起来很神秘)
为什么分解 facet 变量时会发生这种情况?
所以这是我最好的猜测和解释。
当 Hadley 说:
This is a known limitation of facetting with a function - the variables you use have to be present on every layer.
他的意思是在ggplot中,当你要在分面函数中使用一个函数时,你需要在每个geom
中都有变量。出现此问题是因为 cyl
变量不存在于 hline
geom
.
中
重要的是要记住,这是一个限制,而不是理想的行为。此外,他们的高效代码如何工作的结果是,当使用函数进行分面时,变量必须存在于每个 geom
.
中
在不研究 ggplot2
函数的细节的情况下,我猜测 aes
围绕 yintercept
参数的作用是为 [=18 提供美学映射=] 功能。 aes
函数将变量映射到绘图的组件,而不是静态值。这是一个重要的区别。即使我们仍然设置 yintercept = 3
,但我们将其放置在美学映射中的事实必须以某种方式引用 cyl
也存在于此 space 中。也就是说,它间接连接 geom_hline
和 cyl
,这意味着它现在在图层中,不再是限制。
这可能不是一个完全令人满意的答案,但如果不阅读 ggplot2
代码来尝试找出出现此限制的具体原因,这可能与您目前所能得到的一样好。希望其中一种解决方法对您来说足够了:)
考虑这段代码:
require(ggplot2)
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ cyl) ## works
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ factor(cyl)) ## does not work
# Error in factor(cyl) : object 'cyl' not found
# removing geom_hline: works again.
Google帮我找了一个debug,即将intercept
包装成aes
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(aes(yintercept = 3)) +
facet_grid(~ factor(cyl)) # works
# R version 3.4.3 (2017-11-30)
# ggplot2_2.2.1
Hadley writes here作为变量的功能需要在每一层。 (这对我来说听起来很神秘)
为什么分解 facet 变量时会发生这种情况?
所以这是我最好的猜测和解释。
当 Hadley 说:
This is a known limitation of facetting with a function - the variables you use have to be present on every layer.
他的意思是在ggplot中,当你要在分面函数中使用一个函数时,你需要在每个geom
中都有变量。出现此问题是因为 cyl
变量不存在于 hline
geom
.
重要的是要记住,这是一个限制,而不是理想的行为。此外,他们的高效代码如何工作的结果是,当使用函数进行分面时,变量必须存在于每个 geom
.
在不研究 ggplot2
函数的细节的情况下,我猜测 aes
围绕 yintercept
参数的作用是为 [=18 提供美学映射=] 功能。 aes
函数将变量映射到绘图的组件,而不是静态值。这是一个重要的区别。即使我们仍然设置 yintercept = 3
,但我们将其放置在美学映射中的事实必须以某种方式引用 cyl
也存在于此 space 中。也就是说,它间接连接 geom_hline
和 cyl
,这意味着它现在在图层中,不再是限制。
这可能不是一个完全令人满意的答案,但如果不阅读 ggplot2
代码来尝试找出出现此限制的具体原因,这可能与您目前所能得到的一样好。希望其中一种解决方法对您来说足够了:)