2

在 ggplot2 中,我正在尝试一件简单的事情,但由于某种原因我无法做到。我已经在数据框中调整了均值和 SE,并且想要绘制均值、误差线,然后将均值与点连接起来。这是代码和错误(除了连接方式之外,它会做所有事情geom_line(使用RCookbook

library(ggplot2)
#data set
data1 <- structure(list(group = structure(1:3, .Label = c("1", "2", "3"
), class = "factor"), estimate = c(55.7466654122763, 65.0480954172939, 
61.9552391704298), SE = c(2.33944612149257, 2.33243565412438, 
2.33754952927041), t.ratio = c(23.8290016171476, 27.8884844271143, 
26.5043535525714)), .Names = c("group", "estimate", "SE", "t.ratio"
), row.names = c(NA, 3L), class = "data.frame")

#the attempted plot
pd <- position_dodge(.1)
ggplot(data1, aes(x=group, y=estimate, group=group)) + 
    geom_errorbar(aes(ymin=estimate-SE, ymax=estimate+SE), 
        colour="black", width=.1, position=pd) +
    geom_line(data=data1, aes(x=group, y=estimate)) + 
    geom_point(position=pd, size=4)

错误:

ymax not defined: adjusting position using y instead
geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
4

3 回答 3

5

如果您group在 ggplot 调用中删除分组并 x = as.numeric(group )在对 的调用中设置geom_line,则它可以工作。

此外,您不需要data1在内部重新引用geom_line

ggplot(data1, aes(x=group, y=estimate)) + 
  geom_errorbar(aes(ymin=estimate-SE, ymax=estimate+SE), 
  colour="black", width=.1, position=pd) +
  geom_line( aes(x=as.numeric(group), y=estimate)) + 
  geom_point(position=pd, size=4)

在此处输入图像描述

如果您groupgroup,那么您只有一个值geom_line来创建一行,因此会出现错误消息。ggplot如果将变量x或映射变量视为一个因素,则会发生相同的错误y- 这是因为如果您将变量编码为一个因素,R(和 ggplot)将认为它们是独立的组,而不是连接点 - 这是明智的默认行为。

编辑 - 带有字母因子标签

由于因子在内部编码的方式,这将适用于字母R因子标签 (即 as.numeric(factor) 返回数字而不是因子标签)

即。

将组更改为a, b,c

levels(data1[['group']]) <- letters[1:3] 
ggplot(data1, aes(x=group, y=estimate)) + 
  geom_errorbar(aes(ymin=estimate-SE, ymax=estimate+SE), 
  colour="black", width=.1, position=pd) +
  geom_line( aes(x=as.numeric(group), y=estimate)) + 
  geom_point(position=pd, size=4)

在此处输入图像描述

于 2012-09-20T01:01:24.910 回答
2

作为 mnel 答案的替代方案,您可以创建一个新变量,以便您拥有一个所有 3 个组都具有相同值的列:

 data1$all <- "All"

然后将其用作group您的线条的美学:

ggplot(data1, aes(x=group, y=estimate)) + 
    geom_errorbar(aes(ymin=estimate-SE, ymax=estimate+SE), 
        colour="black", width=.1, position=pd) +
    geom_line(aes(x=group, y=estimate, group=all)) + 
    geom_point(position=pd, size=4)

Mnel 的答案可能更优雅,但如果组不是数字并且不能如此直接地转换为数字,这可能会更好。

于 2012-09-20T01:05:27.160 回答
1

您还可以查看此SO Question的第二个答案如果您正在努力实现更全面的实施,这可能会为您节省一些时间。

于 2012-09-20T01:26:29.830 回答