2

我一直无法找到一个简单的模拟来从 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 轴上的年中值不完全一致。我哪里出错了?

4

2 回答 2

1

也许比你想要的更复杂,但是:

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

(这group=1是必要的,因为 Year 变量 ( 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选择保留交叉分类因子的数字性质,那会更好/更容易......)

于 2012-04-25T14:15:52.307 回答
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)

在此处输入图像描述

于 2012-04-25T20:28:42.057 回答