geom_vline的行为是否与其他ggplot geom的行为不一致?

时间:2014-06-06 20:03:42

标签: r ggplot2

似乎geom_vline表现不正常"正确"与其他ggplot geoms相比,具有色彩美感。我试图弄清楚我是否误解了geom_vline的某些内容,或者这是否是geom_vline设计的疏忽。

# Fake data for illustration
dat=data.frame(x=rnorm(60), y=rep(LETTERS[1:3],20))

所有这些都按预期工作:

# Density plot of x with vertical median line
ggplot(data=dat) + 
  geom_density(aes(x=x)) + 
  geom_vline(aes(xintercept=median(x)))

# Density plot of exp(x) with vertical median line
ggplot(data=dat) + 
  geom_density(aes(x=exp(x))) +
  geom_vline(aes(xintercept=median(exp(x))))

# Separate density plots of exp(x) for each level of y
ggplot(data=dat) + 
  geom_density(aes(x=exp(x), colour=y))

enter image description here

但是,下面的图表的工作方式不同。我期望下面的图中的第二个geom_vline语句包含每个级别y的单独中间线。但实际上它只是在x的所有值的中间值处添加了一行(正如它与第一个geom_vline语句完全相同的事实所示)。

# Separate density plots of x for each level of y
ggplot(data=dat) + 
  geom_density(aes(x=x, colour=y)) + 
  geom_vline(aes(xintercept=median(x)), lwd=4, colour="black") +
  geom_vline(aes(xintercept=median(x), colour=y), lwd=1)

# Density plot of x, faceted by level of y
ggplot(data=dat) + 
  geom_density(aes(x=x, colour=y)) + 
  geom_vline(aes(xintercept=median(x)), lwd=4, colour="black") +
  geom_vline(aes(xintercept=median(x), colour=y), lwd=1) + 
  facet_grid(. ~ y)

enter image description here

似乎geom_vline的行为与通常的ggplot逻辑的预期不同。例如,如上所示,我可以将数据exp(x)的函数传递给geom_density,并且当包含颜色美学时,它会为y的每个级别返回单独的密度图。此外,只要没有颜色美学,我就可以将数据函数exp(x)median(exp(x))传递给geom_vline,它也会按预期运行。但是当我尝试使用颜色美学或使用geom_vline进行分面时,它无法为colour变量的每个级别提供单独的中间线,而是为所有{x变量添加一条中间线。 {1}}值。

我知道我可以将预先汇总的数据传递给geom_vline以获得我想要的行为(事实上,回答this SO question是引发此处讨论的问题的原因),但我尝试过了解geom_vline相对于其他ggplot geoms的行为是否确实存在不一致。

我错过了某些内容,或者geom_vline的行为与其他ggplot地理位置有什么不同?

1 个答案:

答案 0 :(得分:1)

“但实际上它只是在x的所有值的中位数处添加了一行。”

是的,你正在取x的所有值的中位数,这只是一个数字。换句话说,median(x)在整个数据集上进行评估,而不是对每个组进行评估。使用geom_point而不是geom_vline的简单图表,您可以看到相同的行为:

qplot(x, median(x), color=y, data=dat)

Value of x against median(x)