我有一个包含日期和计数列的数据框。我需要创建一个条形图,其中x轴显示年份和月份,y轴显示落入适当时间段的相应行的总和。
data <- data.frame(Date = as.Date(c("01/01/2014","02/01/2014","03/03/2014","07/08/2014","08/08/2014","09/08/2014","10/10/2014"), "%d/%m/%Y"))
x <- as.Date(data$Date)
y <- sample(10, length(x))
tmp <- data.frame(dt = format(x, "%Y-%m"), cnt = y, stringsAsFactors = FALSE)
# # Pre-Allocate the table
# minYr = min(as.numeric(strftime(data$Date, "%Y")))
# maxYr = min(as.numeric(strftime(data$Date, "%Y")))
# # The table will contain the number of months in a year.
# n <- (maxYr - minYr + 1) * 12
# dt <- character(n)
# cnt <- numeric(n)
# for (i in minYr:maxYr) {
# for (j in c("01","02","03","04","05","06","07","08","09","10","11","12")) {
# lev <- (i - minYr) * 12 + as.numeric(j)
# dt[lev] <- paste0(as.character(i),"-",j,"-01")
# cnt[lev] <- 0
# }
# }
# dt = as.Date(dt, format="%Y-%m-%d")
# tmp <- data.frame(dt = format(dt, "%Y-%m"), cnt, stringsAsFactors = FALSE)
# tmp <- rbind(tmp, data.frame(dt = format(x, "%Y-%m"), cnt = y, stringsAsFactors = FALSE))
#
tmp2 <- aggregate(cnt ~ dt, tmp, sum)
g <- ggplot(tmp2, (aes(x = dt, y = cnt)))
g + geom_bar(stat="identity")
上面的代码绘制了数据,但如果没有特定月份的交易,则不会显示。我希望图表显示缺失的月数值为零。
这段重要的代码在每个月内用零预分配并给出了我想要的答案,但我想知道是否可以通过利用内置的ggplot功能来避免它。
答案 0 :(得分:0)
您可以使用scale_x_date
来实现此目的。但您需要将x
变量更改为Date
类。
library(scales)
g <- ggplot(tmp2, (aes(x = as.Date(paste0(dt, '-01')), y = cnt)))
g + geom_bar(stat="identity") +
scale_x_date(name='dt', breaks = date_breaks("month"), labels = date_format('%Y-%m'))
编辑:要获得所需的条形宽度,可以将width
参数添加到geom_bar
:
g + geom_bar(stat="identity", width=28) +
scale_x_date(name='dt', breaks = date_breaks("month"), labels = date_format('%Y-%m'))
当然,您还可以在scale_x_date
参数中添加限制,以使其在所需位置开始和结束:
g + geom_bar(stat="identity", width=28) +
scale_x_date(name='dt',
breaks = date_breaks("month"),
labels = date_format('%Y-%m'),
limits=as.Date(c('2014-01-01', '2014-12-01')))