Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用ggplot2将x轴从年更改为月_R_Ggplot2 - Fatal编程技术网

R 如何使用ggplot2将x轴从年更改为月

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) 正如你所看到的,这不是一个很好的图表,更合理的做法是按月份而不是按天进行细分。但是,当我尝试此代

我有一个网络访问量随时间变化的图表,它描绘了从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)+
   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()