ggplot时间序列的条形图

15

我正在阅读Hadley Wickham关于ggplot的书,但我在条形图中绘制一些权重随时间变化的数据时遇到了麻烦。以下是示例数据:

dates <- c("20040101","20050101","20060101")
dates.f <- strptime(dates,format="%Y%m%d")

m <- rbind(c(0.2,0.5,0.15,0.1,0.05),c(0.5,0.1,0.1,0.2,0.1),c(0.2,0.2,0.2,0.2,0.2))
m <- cbind(dates.f,as.data.frame(m))

这个数据框的第一列是日期,每行对应的是相应的权重。我想使用 "fill" 参数为每年的权重绘制一个条形图。

我能够使用以下方式将权重绘制为条形图:

Translated:

这个数据框的第一列是日期,每行对应的是相应的权重。我想使用 "fill" 参数为每年的权重绘制一个条形图。

我能够使用以下方式将权重绘制为条形图:

p <- ggplot(m,aes(dates.f))
p+geom_bar()

然而,这并不是我想要的。我希望在每个条形图中看到每个权重的贡献。此外,我不明白为什么 x 轴上有奇怪的格式,即为什么显示“2004-07”和“2005-07”。

感谢您的帮助。

2个回答

15
希望这就是您要找的内容:

ggplot2 需要数据以长格式提供。

require(reshape2)
m_molten <- melt(m, "dates.f")

绘图本身是由

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
  geom_bar(stat="identity")

enter image description here

如果你想让它们并排放置,可以在geom_bar中添加position="dodge"

编辑

如果你只想要每年的间隔,请将m_molten$dates.f转换为日期。

require(scales)
m_molten$dates.f <- as.Date(m_molten$dates.f)

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
  geom_bar(stat="identity") + 
  scale_x_date(labels = date_format("%y"), breaks = date_breaks("year"))

P.S.:查看http://vita.had.co.nz/papers/tidy-data.pdf,了解 Hadley 的整洁数据哲学。


也许有一个小问题:我想通过 scale_x_date(lables=date_format("%y")) 更改标签。但是这会出现错误,无法找到 date_format 函数。我该如何只显示 04、05、06? - math

3
为了创建所需的图形,您需要将数据从“宽”格式转换为“长”格式。有许多方法可以实现这一点,包括基本R中的reshape()函数(不建议使用),reshape2tidyr
tidyr包中,您有两个函数来重新塑造数据,即gather()spread()
函数gather()将数据从宽格式转换为长格式。在此情况下,您需要收集V1:V5列。
请尝试以下操作:
library("tidyr")

tidy_m <- gather(m, var, value, V1:V5)

ggplot(tidy_m,aes(x = dates.f, y=value, fill=var)) +
  geom_bar(stat="identity")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接