我无法找到一个简单的模拟用于绘制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轴上的年中值精确对齐。我哪里出错了?
答案 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")
另一种方法是创建一个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)