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

时间:2010-01-14 11:52:36

标签: 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

我想要生成的图是:

plot(d$iter, d$k1)
plot(density(d$k1))

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

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

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

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

由于

4 个答案:

答案 0 :(得分:15)

简短回答是“不”,你无法避免创建数据框。 ggplot要求数据位于数据框中。如果使用qplot,则可以为x和y分配不同的向量,但在内部,它仍然会根据传入的参数创建数据框。

我同意juba的建议 - 学会使用reshape函数,或者更好的reshape包含melt / cast函数。一旦您快速将数据放入长格式,创建令人惊叹的ggplot图形就会更近一步!

答案 1 :(得分:5)

是的,您可以避免创建数据框:只需为基础层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))

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

  

所有对象都将加固以生成数据框。

答案 2 :(得分:4)

您可以使用reshape功能将数据框转换为“长”格式。可能比你的代码快一点吗?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2"))
     iter time   k id
1.k1    1   k1 0.2  1
2.k1    2   k1 0.6  2
1.k2    1   k2 0.3  1
2.k2    2   k2 0.4  2

答案 3 :(得分:3)

所以只是添加到以前的答案。使用qplot,你可以做到

p <- qplot(y=d$k2, x=d$k1)

然后从那里进一步建造它,例如与

p + theme_bw()

但我同意 - 融化/演员通常是前进的方向。