我有类似的问题,这其中对使用多个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
不好.
这似乎有效,
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)
归档时间: |
|
查看次数: |
390 次 |
最近记录: |