【问题标题】:R ggplot with two series: points and errorbars with legendsR ggplot 有两个系列:带有图例的点和误差线
【发布时间】:2014-07-31 15:42:45
【问题描述】:

如果我有这样的数据框:

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))
 )

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

【问题讨论】:

  • stackoverflow.com/questions/1787578/… 看起来很有帮助。
  • 不,你最好先融合你的数据框,这样你就有一个值obspred映射到colorshape的列。跨度>
  • @Joran:观察来自一个数据源,模型预测和误差线来自另一个数据源。我想对于复杂的数据,这建议应该为每个图形生成一个更简单的绘图数据框。
  • 它们来自哪里并不重要。您问如何创建图例,而在 ggplot 中做到这一点的最佳方法是将变量映射到美学并避免具有相同几何图形的多行。

标签: r ggplot2


【解决方案1】:

这是一种将 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

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

【讨论】:

    【解决方案2】:

    这里有一个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 列,因此您的代码无法运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 2021-11-27
      • 2017-06-12
      • 2015-08-02
      • 2012-10-13
      • 2013-01-10
      相关资源
      最近更新 更多