2015-05-12 98 views
1

我試圖在多年內創建一個從日常數據中彙總的月度數據的分組條形圖。我已經完成了我從x軸想要的方面,使用faceting作爲應用次級排序(年和月)的方式。現在,我已經面臨年份,ggplot顯示所有月份 - 即使沒有數據。這是浪費空間,我的實際數據集有多年的數據,我想添加標籤,所以空間是一個問題。在r - 個月中按年份劃分月度數據,沒有數據出現

如何在不浪費空間的情況下實現這一目標?有沒有辦法在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

第一行後: 「錯誤在as.Date.numeric(C(as.Date(」 2014-05-01 「):as.Date(」 2015年5月10日「))): 'origin'必須提供」 –

+3

您可能想嘗試'facet_wrap(〜year,scale =「free」)' – jazzurro

+0

@jazzurro謝謝!這解決了它。有沒有辦法選擇你的答案作爲解決方案? –

回答

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") 

相關問題