题
我运行一个蒙特卡罗模拟和输出的形式是:
> 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前进的方向
不隶属于 StackOverflow