按月计算每月数据,在没有数据的情况下显示

时间:2015-05-12 04:30:22

标签: r ggplot2

我正在尝试创建一个多年来每日数据汇总的分组条形图。我已经通过刻面完成了我想要的X轴,使用刻面作为应用次要排序(年和月)的方法。现在我已经面对年度,ggplot显示所有月份 - 即使没有数据。这是浪费空间,我的实际数据集有多年的数据,我想添加标签,所以空间是一个问题。

如果没有浪费的空间,我怎样才能做到这一点?有没有办法在没有刻面的情况下在x轴上添加辅助排序(年,月)?

ggplot example

# create data set
date = seq(as.Date("2014-05-01"),as.Date("2015-05-10"), "day")
revenue = runif(375, min = 0, max = 200)
cost = runif(375, min = 0, max = 100)
df = data.frame(date,revenue,cost)
head(df)

# adding month and year column, then aggregating to monthly revenue and cost 
library(plyr)
df$month <- month(df$date, label=TRUE) 
df$year <- year(df$date) 
df <- as.data.frame(ddply(df, .(month,year), numcolwise(sum)))

# melting the data for a 'grouped chart' in ggplot
library(reshape)
df <-melt(df, id = c("month","year"))

#create chart
library(ggplot2)
g <-ggplot(df, aes(x=month, y=value, fill=variable)) 
g + geom_bar(stat="identity", position="dodge") + facet_wrap(~ year)

我确信在ggplot中有更优雅的方法可以做到这一点。我是对的吗?

1 个答案:

答案 0 :(得分:1)

关键是在scale = "free"中使用facet_wrap()。通过遵循您的代码(带修订版),您将看到下面的图形。

set.seed(222)
date = seq(as.Date("2014-05-01"),as.Date("2015-05-10"), "day")
revenue = runif(375, min = 0, max = 200)
cost = runif(375, min = 0, max = 100)
mydf = data.frame(date,revenue,cost)

mydf$month <- month(mydf$date, label=TRUE) 
mydf$year <- year(mydf$date) 
mydf2 <- as.data.frame(ddply(mydf, .(month,year), numcolwise(sum)))

mydf3 <- melt(mydf2, id = c("month","year"))

ggplot(mydf3, aes(x=month, y=value, fill=variable)) +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~ year, scale = "free")

enter image description here