我可以避免在ggplot2中使用数据框吗?

csg*_*pie 24 r ggplot2

我正在运行monte-carlo模拟,输出格式如下:

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
> d
iter  k1   k2
1     0.2  0.3
2     0.6  0.4
Run Code Online (Sandbox Code Playgroud)

我想要生成的图是:

plot(d$iter, d$k1)
plot(density(d$k1))
Run Code Online (Sandbox Code Playgroud)

我知道如何使用ggplot2进行等效绘图,转换为数据框

new_d = data.frame(iter=rep(d$iter, 2), 
                   k = c(d$k1, d$k2), 
                   label = rep(c('k1', 'k2'), each=2))
Run Code Online (Sandbox Code Playgroud)

然后绘图很容易.然而,迭代次数可能非常大,并且k的数量也可能很大.这意味着搞乱一个非常大的数据框架.

无论如何,我可以避免创建这个新的数据框架?

谢谢

Har*_*lan 15

简短的回答是"不",你无法避免创建数据框.ggplot要求数据在数据框中.如果使用qplot,可以为x和y赋予它单独的向量,但在内部,它仍然从您传入的参数中创建数据框.

我同意朱巴的建议 - 学会使用这个reshape功能,或者更好的reshape包装melt/ cast功能.一旦您快速将数据放入长格式,创建令人惊叹的ggplot图形就会更近一步!


sco*_*sty 7

是的,您可以避免创建数据框:只需将一个空的参数列表提供给基础层ggplot()。这是一个基于您的代码的完整示例:

库(ggplot2)

d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
# desired plots:
# plot(d$iter, d$k1)
# plot(density(d$k1))

ggplot() + geom_point(aes(x = d$iter, y = d$k1))
# there is not enough data for a good density plot,
# but this is how you would do it:
ggplot() + geom_density(aes(d$k1))
Run Code Online (Sandbox Code Playgroud)

请注意,尽管这允许不创建数据框,但仍可能在内部创建数据框。参见,例如,以下摘录自?geom_point

将强化所有对象以产生数据框。