繁体   English   中英

转换简单的ggplot2代码以使用data.table

[英]Converting simple ggplot2 code to use data.table

我的旧代码看起来像这样:

library(ggplot2)
gp<-ggplot(NULL,aes(x=Income))
gp<-gp+geom_density(data=dat$Male,color="blue")
gp<-gp+geom_density(data=dat$Female,color="green")
gp<-gp+geom_density(data=dat$Alien,color="red")
plot(gp) #Works

现在我开始使用优秀的data.table库(而不是data.frame):

library(data.table)
cols<-c("blue","green","red")
gp<-ggplot(NULL,aes(x=Income))
dat[, list(gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender]
#I even tried
dat[, list(gp<-gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender]
plot(gp) #Error: No layers in plot

我不确定是什么问题,但似乎我在J()中运行的代码在外部范围内没有得到识别。

我怎样才能以data.table惯用的方式实现这一目标?

ggplot2应该与长格式data.tables一起使用,方式与长格式data.frames相同:

library(data.table)
set.seed(42)

dat <- rbind(data.table(gender="male",value=rnorm(1e4)),
             data.table(gender="female",value=rnorm(1e4,2,1))
             )

library(ggplot2)
p1 <- ggplot(dat,aes(x=value,color=gender)) + geom_density()
print(p1)

不要将宽格式data.frames(或data.tables)提供给ggplot2。

如果你有很多组,绘图会很慢,但由于ggplot2的内部魔力,没有data.table可以真正帮助(直到Hadley以某种方式实现它)。 您可以尝试在ggplot2之外ggplot2密度,但这只会对您有所帮助:

set.seed(42)
dat2 <- data.table(gender=as.factor(1:5000),value=rnorm(1e7))
plotdat <- dat2[,list(x_den=density(value)$x,y_den=density(value)$y),by=gender]
p2 <- ggplot(plotdat,aes(x=x_den,y=y_den,color=gender)) + geom_line()
print(p2) #this needs some CPU time

当然,如果你有很多小组,你可能会做错误的情节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM