我运行一个蒙特卡罗模拟和输出的形式是:

> 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的数量也可能很大。这意味着具有非常大的数据帧摆弄。

反正我能避免建立这个新数据帧?

由于

有帮助吗?

解决方案

短的答案是“否”,则不能避免创建的数据帧。 ggplot要求数据是在一个数据帧。如果使用qplot,可以给它一个x和y不同的载体,但是在内部,它仍然创建数据帧看看您在传递的参数的

我同意朱巴的建议 - 学会使用reshape功能,或与reshape / melt功能更好,但在cast包。一旦你把长格式的数据,创造惊人的ggplot图形得到快速成为一个更近了一步!

其他提示

是,可能的是你以避免创建的数据帧:只给一个空的参数列表到基础层,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以下提取:

  

所有对象将被强化,以产生数据帧。

您可以使用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

所以刚才添加到以前的答案。随着qplot你可以做

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

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

p + theme_bw()

但我同意 - 熔融/铸造是genereally前进的方向

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top