使用Reduce将图层添加到ggplot

时间:2014-06-04 23:28:02

标签: r ggplot2

我有类似于this one的问题,关于使用多个数据帧来绘制ggplot。我想创建一个基本图,然后使用数据帧列表添加数据(下面描述的基本原理/用例)。

library(ggplot2)

# generate some data and put it in a list
df1 <- data.frame(p=c(10,8,7,3,2,6,7,8),v=c(100,300,150,400,450,250,150,400))
df2 <- data.frame(p=c(10,8,6,4), v=c(150,250,350,400))
df3 <- data.frame(p=c(9,7,5,3), v=c(170,200,340,490))
l <- list(df1,df2,df3)

#create a layer-adding function
addlayer <-function(df,plt=p){
  plt <- plt + geom_point(data=df, aes(x=p,y=v))
  plt
}

#for loop works
p <- ggplot()
for(i in l){
  p <- addlayer(i)
}

#Reduce throws and error
p <- ggplot()
gg <- Reduce(addlayer,l)
Error in as.vector(x, mode) : 
  cannot coerce type 'environment' to vector of type 'any'
Called from: as.vector(e2)

在写出这个例子时,我意识到for loop并不是一个糟糕的选择,但不会介意Reduce的简洁性,特别是如果我想将几个函数链接在一起。

对于那些感兴趣的人,我的用例是在地图上的点之间绘制一些未连接的线。从参考数据框中我发现最简洁的映射方法是生成子集化数据帧列表,每个数据帧对应一行。我不希望它们连接起来,因此geom_path并不好。

1 个答案:

答案 0 :(得分:7)

这似乎有效,

addlayer <-function(a, b){
  a + geom_point(data=b, aes(x=p,y=v))
}

Reduce(addlayer, l, init=ggplot())

请注意,您还可以使用图层列表

ggplot() + lapply(l, geom_point, mapping = aes(x=p,y=v))

但是,这两种策略都不建议; ggplot2完全能够在单层中绘制多条未连接的线(使用例如组参数)。它更有效,代码更清晰。

names(l) = 1:3
m = ldply(l, I)
ggplot(m, aes(p, v, group=.id)) + geom_line()