【问题标题】:connecting lines between means of factors in ggplot2ggplot2中因子均值之间的连接线
【发布时间】:2013-02-26 18:56:56
【问题描述】:

我试图创建一个简单的均值和交互折线图。我在 y 轴上有一个 DV(阅读时间),在 x 轴上有一个因子(长度),另一个作为分组变量(位置)。

我使用的语法如下。对于两个长度条件中的每一个,数据都绘制为一条线上的单个点,但没有与两个长度条件之间的线连接。我在语法方面缺少什么?

我使用的是 R i386 2.15.2,上周更新了 ggplot2。

这是一个可重现的例子

SubjectID <- c(101,101,101,101,101,101,101,101,102,102,102,102,102,102,102,102,
        201,201,201,201,201,201,201,201,202,202,202,202,202,202,202,202)
Group <- c("PWA","PWA","PWA","PWA","PWA","PWA","PWA","PWA","PWA","PWA","PWA",
        "PWA","PWA","PWA","PWA","PWA","Control","Control","Control",
        "Control","Control","Control","Control","Control","Control",
        "Control","Control","Control","Control","Control","Control",
        "Control")
Length <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)
Pos <- c(1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2)
ReadT <- c(6.7,7.6,6.4,7.9,5.4,6.4,6.3,7.4,6.9,7.2,6.7,7.4,5.7,6.1,6.5,7.8,
        6.1,5.7,4.9,6.1,4.7,6.5,6.1,6.2,6.9,5.9,4.8,6.5,4.6,6.3,6.7,6.6)

data <- data.frame (SubjectID, Group,Length,Pos,ReadT)
data$Length <- factor(data$Length, order = TRUE,
        levels = c(1,2),
        labels = c("Length 1", "Length 2"))
data$Pos <- factor(data$Pos, order = TRUE,
        levels = c(1,2),
        labels = c("Position 1", "Position 2"))

qplot(Length, data=data, ReadT, geom=c("point", "line"), 
    stat="summary", fun.y=mean, group=Pos, colour=Pos, 
    facets = ~Group)

【问题讨论】:

标签: r ggplot2 linegraph


【解决方案1】:

我认为您没有重现任何不一致之处,但是通过尝试将所有内容压缩到单个 qplot 调用中,您的问题在一定程度上被掩盖了。

您的x 变量Length 是一个因素,因此ggplot 明智地考虑Length 1Length 2 是独立的,并且不会连接线路。

其次,您将无法使用 stat_summary 来通过您的 x 值进行汇总,而不强制这些成为一个因素(因此是独立的)。

我发现预先汇总数据而不依赖 ggplot 最容易。

例如

library(plyr)
data.means <- ddply(data, .(Group, Pos, Length), summarize, ReadT = mean(ReadT))

然后使用ggplot 而不是qplot 构建绘图,为您提供所需的灵活性(和透明度)。

连接线路的技巧是在对geom_line 的调用中考虑x 数字,例如参见here

ggplot(data.means, aes(x= Length, y= ReadT, colour = Pos)) + 
 geom_point() +
 geom_line(aes(x=as.numeric(Length))) +
 facet_grid(~Group)

如果您坚持使用原始数据和stat_xxxx 函数,您也可以使用stat_smooth 复制此方法来估计均值(这会将x 归类为数字)

ggplot(data, aes(x = Length, y= ReadT, colour = Pos)) + 
 stat_summary(fun.y = 'mean', geom = 'point')+
 stat_smooth(method = 'lm', aes(x=as.numeric(Length)), se = FALSE) +
 facet_grid(~Group)

【讨论】:

  • 您说的完全正确,我无法复制它的工作时间——这将仍然是一个谜。我已经从标题和问题中删除了那部分。感谢您提供的非常有帮助的 cmets!我还看到另一篇文章解决了相同的问题(我之前错过了),它指向另一个可能在这里有用的包 - 请参阅:ggplot2:连接分组数据方式的线
  • 在第一个ggplot代码中需要有3个括号mafter ..numeric(Length
猜你喜欢
  • 2011-04-07
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多