【问题标题】:Order dates in ggplot by month按月在ggplot中订购日期
【发布时间】:2016-02-22 16:42:30
【问题描述】:

我有DF$Date,格式为“yyyy-mm-dd”,如下所示。有没有一种简单的方法可以在 ggplot 中按月分组?

Date
2015-07-30
2015-08-01
2015-08-02
2015-08-06
2015-08-11
2015-08-12

我添加了一个列 DF$Month 作为“年月名”(例如 2015 年 4 月。) 我正在通过DF$Month<-strftime(DF$Date,format="%B %Y") 做这个

有没有一种快速的方法来分解月份/年份,以便它们是序数? 我通过格式化使用了一种解决方法: DF$Month<-strftime(DF$Date,format="%Y-%m") 以便较大的数字首先是月份,然后是月份。 这给出了可排序的输出:

DF$Month
"2015-07" 
"2015-08"

这个输出允许我得到这个分组: http://imgur.com/df1FI3s 使用此图时:

MonthlyActivity<-ggplot(DF,aes(x=Month, y=TotalSteps))+
  geom_boxplot()
MonthlyActivity

是否有任何替代方法,以便我可以使用完整的月份名称并且仍然按照正确的时间顺序?

【问题讨论】:

  • 为什么不把整个日期转换成一个日期对象呢? (as.Date(....)。这将允许 ggplot 生成日期刻度。如果没有 reproducible example,其他任何事情都很难说
  • 我不确定你想要什么。你能详细说明一下吗?
  • 我已经修改了我的帖子。如果有更多细节要补充,请告诉我。
  • 你想画什么? “按月分组”是什么意思?
  • 这个想法是我有一堆单独的日期、数据点,但想创建一个箱线图,按月聚合日期。

标签: r date


【解决方案1】:

可能还有其他解决方案,但这里有一个包含完整月份名称的解决方案。正如您已经发现的那样,您需要一个 x 变量来分组。然后我们可以将其视为“排序因子”问题而不是日期尺度问题。

#first, generate some data
dat <- data.frame(date=sample(seq(as.Date("01012015",format="%d%m%Y"),
                           as.Date("01082015", format="%d%m%Y"),by=1),1000,T),
                  value=rnorm(1000))

我们找到最小和最大月份,并进行一些日期算术以允许所有开始日期(这样当最小日期为 29 日/30 日/31 日时,2 月就不会被跳过)。我为此使用了 lubridate。

library(lubridate)
min_month = min(dat$date)-day(min(dat$date))+1
max_month = max(dat$date)-day(max(dat$date))+1

我们生成一个分组变量。这是一个带有“2015 年 1 月,2015 年 3 月”标签的因素。但是,我们通过创建从最小日期到最大日期的序列(按月)并以相同的方式对其进行格式化来强制排序。

dat$group <- factor(format(dat$date, "%B %Y"), 
                    levels=format(seq(min_month, max_month,by="month"),
                                                             "%B %Y"))

这会强制轴上的排序:

【讨论】:

  • 谢谢,逐个关卡是我所缺少的!不过,看起来 2 月的一些日期已经关闭,导致 NA。我相信测序正在寻找 2 月底,我们如何解释这一点?
  • 确实,你快到了。祝项目好运:)
  • 已在上面编辑,但后续问题:看起来 2 月的一些日期已经关闭,导致 NA。我相信测序正在寻找 2 月底,我们如何解释这一点?
  • 不确定您的意思,我看不到任何编辑。对不起
  • 我使用DF$Month2&lt;-factor(format(DF$Date, "%B %Y"),levels=format(seq(min(DF$Date),max(DF$Date),by="month"),"%B %Y"))在日期序列中添加了但是,随着日期范围扩展到2016-02-01,代码的结果是NA
【解决方案2】:

尝试添加

scale_x_discrete(limits = month.abb)

所以你的代码是

MonthlyActivity&lt;-ggplot(DF,aes(x=Month, y=TotalSteps))+ geom_boxplot()+scale_x_discrete(limits = month.abb)

你需要library(dplyr)

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2023-01-23
    • 2015-09-07
    相关资源
    最近更新 更多