【问题标题】:Converting simple ggplot2 code to use data.table将简单的 ggplot2 代码转换为使用 data.table
【发布时间】:2013-03-20 15:35:07
【问题描述】:

我的旧代码如下所示:

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 惯用的方式实现这一点?

【问题讨论】:

  • 我不认为它会那样工作。请记住,data.table data.frame 并使用您的旧代码。
  • @Roland,是的,当然我仍然可以使用我的旧代码。但这会有点违背使用 data.table 的目的。毕竟,我想通过数据表的能力(即 dt[,,by=something])来利用组,而不是使用 split()

标签: r ggplot2 data.table


【解决方案1】:

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 之外的密度,但这只会对您有所帮助:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2015-01-03
    • 2021-06-09
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多