R 如何使用ggplot2将x轴从年更改为月
我有一个网络访问量随时间变化的图表,它描绘了从2014年到现在的每日流量,如下所示:R 如何使用ggplot2将x轴从年更改为月,r,ggplot2,R,Ggplot2,我有一个网络访问量随时间变化的图表,它描绘了从2014年到现在的每日流量,如下所示: ggplot(subset(APRA, Post_Day > "2013-12-31"), aes(x = Post_Day, y = Page_Views))+ geom_line()+ scale_y_continuous(labels = comma)+ ylim(0,50000) 正如你所看到的,这不是一个很好的图表,更合理的做法是按月份而不是按天进行细分。但是,当我尝试此代
ggplot(subset(APRA, Post_Day > "2013-12-31"), aes(x = Post_Day, y = Page_Views))+
geom_line()+
scale_y_continuous(labels = comma)+
ylim(0,50000)
正如你所看到的,这不是一个很好的图表,更合理的做法是按月份而不是按天进行细分。但是,当我尝试此代码时:
ggplot(subset(APRA, Post_Day > "2013-12-31"), aes(x = Post_Day, y = Page_Views))+
geom_line()+
scale_y_continuous(labels = comma)+
ylim(0,50000)+
scale_x_date(date_breaks = "1 month", minor_breaks = "1 week", labels = date_format("%B"))
我得到这个错误:
错误:无效输入:date_trans仅适用于类date的对象
日期字段Post_Day是POSIXct。页面视图是数字的。数据如下所示:
Post_Title Post_Day Page_Views
Title 1 2016-05-15 139
Title 2 2016-05-15 61
Title 3 2016-05-15 79
Title 4 2016-05-16 125
Title 5 2016-05-17 374
Title 6 2016-05-17 39
Title 7 2016-05-17 464
Title 8 2016-05-17 319
Title 9 2016-05-18 84
Title 10 2016-05-18 64
Title 11 2016-05-19 433
Title 12 2016-05-19 418
Title 13 2016-05-19 124
Title 14 2016-05-19 422
我希望将X轴从每日粒度更改为每月粒度。问题中显示的示例数据集每天有多个数据点。因此,无论如何,它都需要按天进行聚合。对于按天或月进行的聚合,使用data.table和lubridate 创建示例数据 由于没有提供可复制的示例,因此创建了一个样本数据集:
library(data.table)
n_rows <- 5000L
n_days <- 365L*3L
set.seed(123L)
DT <- data.table(Post_Title = paste("Title", 1:n_rows),
Post_Day = as.Date("2014-01-01") + sample(0:n_days, n_rows, replace = TRUE),
Page_Views = round(abs(rnorm(n_rows, 500, 200))))[order(Post_Day)]
DT
绘制原始数据
如果没有聚合,数据可以通过
library(ggplot2)
ggplot(DT) + aes(Post_Day, Page_Views) + geom_line()
按天累计
要按天聚合,使用分组参数by of data.table,并将sum作为聚合函数。聚合将数据点的数量从5000个减少到1087个。因此,情节看起来不那么复杂
按月合计
为了按月份进行聚合,使用分组参数by,但这次Post_Day映射到各个月份的第一天。因此,2014-03-26成为2014-03-01的后一个月,仍然属于POSIXct类别。这样,x轴保持连续,具有日期刻度。这避免了将日后转换为因子时的麻烦,例如,2014-03年使用格式日后,%Y-%m,其中x轴将变得离散
请让我知道这是否是你要找的。另外,我还没有编译它,请告诉我它是否抛出了一些错误 这难道不是一个关于如何将日期聚合为月份,而不是如何更改x轴的问题吗?@C8H10N4O2是的,我想是的。我原以为这就是我用scale_x_date所做的,但它似乎不起作用。使用Post_Day>2013-12-31表示Post_Day是一个字符变量。您应该使用as.date将此变量转换为日期类,然后使用Post_Day>as.Date2013-12-31。您可以为yearpost_Day和monthpost_Day创建列,也可以使用其中一个列作为date@lmoR足够聪明,可以处理2013年12月31日后一天>的比较,当后一天是一个日期时,我不确定这是否正确问题的正确解决方案。听起来问题在于更改轴上的标签,而不是聚合数据。ggplot2::scale_x_date还具有scale_x_datetime选项-将posixct日期作为日期时间而不是日期将显示错误,通过将scale_x_date更改为scale_x,可以轻松修复此错误_datetime@LucieCBurgess使用scale_x_datetime而不是scale_x_date会使错误消息消失,但不会解决根本问题。误解在于,将比例改为月份也会自动按月汇总数据,但事实并非如此。用OP的话来说,正如你们所看到的,这并不是一个很好的图表,更合理的做法是按月份而不是按天进行细分。OP的数据每天包含多个条目,无论如何,这些条目需要按天进行聚合。显然,OP对我的回答很满意,并接受了。
library(ggplot2)
ggplot(DT) + aes(Post_Day, Page_Views) + geom_line()
ggplot(DT[, .(Page_Views = sum(Page_Views)), by = Post_Day]) +
aes(Post_Day, Page_Views) + geom_line()
ggplot(DT[, .(Page_Views = sum(Page_Views)),
by = .(Post_Month = lubridate::floor_date(Post_Day, "month"))]) +
aes(Post_Month, Page_Views) + geom_line()
APRA$month <- as.factor(stftime(APRA$Post_Day, "%m")
APRA <- APRA[order(as.numeric(APRA$month)),]
z <- apply(split(APRA, APRA$month), function(x) {sum(as.numeric(APRA$Page_Views))})
z <- do.call(rbind, z)
z$month <- unique(APRA$month)
colnames(Z) <- c("Page_Views", "month")
ggplot(z, aes(x = month, y = Page_Views)) + geom_line()