使用Reduce将图层添加到ggplot

zac*_*ach 2 r ggplot2

我有类似的问题,这其中对使用多个dataframes用于绘制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)
Run Code Online (Sandbox Code Playgroud)

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

对于那些感兴趣的人,我的用例是在地图上的点之间绘制一些未连接的线.从参考数据框中我发现最简洁的映射方法是生成子集化数据帧列表,每个数据帧对应一行.我不想让他们联系,所以geom_path不好.

bap*_*ste 7

这似乎有效,

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

Reduce(addlayer, l, init=ggplot())
Run Code Online (Sandbox Code Playgroud)

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

ggplot() + lapply(l, geom_point, mapping = aes(x=p,y=v))
Run Code Online (Sandbox Code Playgroud)

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

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