R ggplot有两个系列:带有图例的点和错误栏

时间:2014-06-10 18:32:34

标签: r ggplot2

如果我有这样的数据框:

obs<-rnorm(20)
d<-data.frame(year=2000:2019,obs=obs,pred=obs+rnorm(20,.1))
d$pup<-d$pred+.5
d$plow<-d$pred-.5
d$obs[20]<-NA
d

我希望观察和模型预测误差条看起来像:

(p1<-ggplot(data=d)+aes(x=year)
 +geom_point(aes(y=obs),color='red',shape=19)
 +geom_point(aes(y=pred),color='blue',shape=3)
 +geom_errorbar(aes(ymin=plow,ymax=pup))
 )

observations and predictive model error bars

如何添加标识红点作为观察值的图例/比例/关键点以及带误差线的蓝色加号作为带范围的点预测?

2 个答案:

答案 0 :(得分:3)

这是将pred / obs熔化成一列的一种解决方案。由于代表无法发布图片。

library(ggplot2)
obs <- rnorm(20)
d <- data.frame(dat=c(obs,obs+rnorm(20,.1)))
d$pup <- d$dat+.5
d$plow <- d$dat-.5
d$year <- rep(2000:2019,2)
d$lab <- c(rep("Obs", 20), rep("Pred", 20))

p1<-ggplot(data=d, aes(x=year)) +
geom_point(aes(y = dat, colour = factor(lab), shape = factor(lab))) +
geom_errorbar(data = d[21:40,], aes(ymin=plow,ymax=pup), colour = "blue") +
scale_shape_manual(name = "Legend Title", values=c(6,1)) +
scale_colour_manual(name = "Legend Title", values=c("red", "blue"))
p1

enter image description here

编辑:感谢代表。已添加图片

答案 1 :(得分:1)

这是一个ggplot解决方案,不需要熔化和分组。

set.seed(1)      # for reproducible example
obs <- rnorm(20)
d   <- data.frame(year=2000:2019,obs,pred=obs+rnorm(20,.1))
d$obs[20]<-NA
library(ggplot2)
ggplot(d,aes(x=year))+
  geom_point(aes(y=obs,color="obs",shape="obs"))+
  geom_point(aes(y=pred,color="pred",shape="pred"))+
  geom_errorbar(aes(ymin=pred-0.5,ymax=pred+0.5))+
  scale_color_manual("Legend",values=c(obs="red",pred="blue"))+
  scale_shape_manual("Legend",values=c(obs=19,pred=3))

这将创建一个颜色和形状比例,每个部分有两个组件(“obs”和“pred”)。然后使用scale_*_manual(...)为颜色设置这些比例(“红色”,“蓝色”)的值,为比例设置(19,3)。

通常,如果您只有两个类别,例如“obs”和“pred”,那么这是一种合理的方式来使用ggplot,并避免将所有内容合并到一个数据框中。如果您有两个以上的类别,或者它们是数据集的组成部分(例如,实际的分类变量),那么您可以像在另一个答案中那样做得更好。

请注意,您的示例遗漏了year列,因此您的代码无法运行。