【问题标题】:Is behavior of geom_vline inconsistent with behavior of other ggplot geoms?geom_vline 的行为是否与其他 ggplot 几何的行为不一致?
【发布时间】:2014-06-06 20:03:42
【问题描述】:

与其他 ggplot 几何图形相比,geom_vline 似乎在颜色美学方面表现得“不恰当”。我试图弄清楚我是否对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))

但是,以下图表的工作方式有所不同。我预计下图中的第二个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)

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

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

我是否遗漏了什么或者geom_vline 的行为真的与其他ggplot geoms 不同?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我看到你的例子时,我立刻想到我应该一直使用stat_summarygeom="vline" 来获得y 的每个级别的垂直中线,但事实证明@987654321 @,所以你必须在ggplot之外进行汇总,然后将汇总数据框传递给geom_vline
    • 这也是我的直觉,我发现了同样的讨论。哦,好吧!
    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2010-12-23
    • 2013-09-02
    • 2020-02-28
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多