简单模拟用于绘制ggplot2中表对象的一条线

时间:2012-04-25 14:10:12

标签: r ggplot2

我无法找到一个简单的模拟用于绘制ggplot2中表对象的折线图。考虑到包装的优雅和实用性,我觉得我必须遗漏一些非常明显的东西。举例来说,考虑一个带有年度观察结果的数据框:

dat<-data.frame(year=sample(c("2001":"2010"),1000, replace=T))

基础R中的快速时间序列图:

plot(table(dat$year), type="l")

切换到qplot,返回错误“尝试应用非功能”:

qplot(table(dat$year), geom="line")

ggplot2需要一个数据框。很公平。但是这会返回相同的错误。

qplot(year, data=dat, geom="line")

在进行了一些搜索和摆弄之后,我放弃了qplot,并提出了以下方法,其中包括指定线几何,对计数进行分箱以及删除最终值以避免绘制零。

ggplot(dat, aes(year) ) + geom_line(stat = "bin", binwidth=1, drop=TRUE)

这似乎是在街区周围漫步。并且它仍然不完全令人满意,因为箱子不能与x轴上的年中值精确对齐。我哪里出错了?

2 个答案:

答案 0 :(得分:1)

可能比你想要的更复杂,但是:

qplot(Var1,Freq,data=as.data.frame(table(dat$year)),geom="line",group=1)

group=1是必要的,因为年变量(Var1)作为因子返回...)

如果您不需要它作为单行,您可以先使用ytab <- as.data.frame(table(dat$year))提取表格并将其转换为数据框...

按照Brian Diggs的回答,如果你愿意构建更多的fortify机器,你可以更多地压缩它:

如果可能,将因子转换为数字的效用函数:

conv2num <- function(x) {
    xn <- suppressWarnings(as.numeric(as.character(x)))
    if (!all(is.na(xn))) xn else x
}

一个fortify方法,将表转换为数据框,然后尝试将列设为数字:

fortify.table <- function(x,...) {
    z <- as.data.frame(x)
    facs <- sapply(z,is.factor)
    z[facs] <- lapply(z[facs],conv2num)
    z
}

现在这几乎可以按照您的意愿运作:

qplot(Var1,Freq,data=table(dat$year),geom="line")

(如果有一个table选项来保留交叉分类因子的数字特性会很好/更容易......)

答案 1 :(得分:1)

扩展Ben的答案,“标准”方法是从表格中创建数据框,此时您可以将这些年份转换回数字。

ytab <- as.data.frame(table(dat$year))
ytab$Var1 <- as.numeric(as.character(ytab$Var1))

以下任何一种都可以使用:

ggplot(ytab, aes(Var1, Freq)) + geom_line()
qplot(Var1, Freq, data=ytab, geom="line")

enter image description here

另一种方法是创建一个fortify函数,它将表转换为数据框,并使用它。

fortify.table <- as.data.frame.table

然后您可以直接传递表而不是数据帧。但是Var1现在仍然是一个因素,所以你需要group=1来连接这条线多年。

ggplot(table(dat$year), aes(Var1, Freq)) + geom_line(aes(group=1))
qplot(Var1, Freq, data=table(dat$year), geom="line", group=1)

enter image description here