在 ggplot2 中对 X 轴上的日期进行格式化

80

我在绘制图表时,非常非常难以让x轴看起来正确。

这是我的数据:

df <- data.frame(
  Month = factor(c(
    "2011-07-31", "2011-08-31", "2011-09-30", "2011-10-31", "2011-11-30",
    "2011-12-31", "2012-01-31", "2012-02-29", "2012-03-31", "2012-04-30",
    "2012-05-31", "2012-06-30"
  )),
  AvgVisits = c(
    6.98655104580674, 7.66045407330464, 7.69761337479304, 7.54387561322994,
    7.24483848458728, 6.32001400498928, 6.66794871794872, 7.207780853854,
    7.60281201431308, 6.70113837397123, 6.57634103019538, 6.75321935568936
  )
)

这是我正在尝试绘制的图表:

ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar() +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User")

那个图表运行良好 - 但是,如果我想要调整日期的格式,我认为应该添加以下内容: scale_x_date(labels = date_format("%m-%Y"))

我正在尝试使日期标签为'MMM-YYYY'

ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar() +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User") +
  scale_x_date(labels = date_format("%m-%Y"))

当我绘制时,我持续收到这个错误:

stat_bin: binwidth默认为range/30。使用'binwidth = x'来调整。

尽管在格式化geom_linegeom_bar方面进行了数小时的研究,但我无法解决它。有人能解释一下我做错了什么吗?

编辑:作为后续想法:你可以将日期用作因子,还是应该在日期列上使用as.Date


你是否已经载入 library(scales) 库? - smillig
@smillig 是的 - scales 已经加载。 - mikebmassey
2个回答

128

要将月份显示为Jan 2017,Feb 2017等:

scale_x_date(date_breaks = "1 month", date_labels =  "%b %Y") 

如果日期占用太多空间,请倾斜它们:

theme(axis.text.x=element_text(angle=60, hjust=1))

9
尝试弄清楚为什么这个方法不起作用,几乎让我疯了。后来发现 theme_bw() 会覆盖 theme() 的任何效果。重新排列顺序后,问题就得到解决了。我将其留在这里,以防其他遇到相同问题的人。 - Ufos
1
感谢您的回答,这对我很有帮助。我写下这些话来表达我的感激之情。 - cloudscomputes
4
这应该绝对是这个问题的被接受答案。另一个需要安装和加载“Scales”库,而这一个使用已经存在于ggplot2中的功能。 - AmphotericLewisAcid
1
@stevec 对于大多数编程语言来说,这是正确的。在这里更重要的是 theme_bw() 覆盖了其他 theme() 配置,这可能会令人困惑。这只是与此答案有些关联。 - Ufos
2
@AmphotericLewisAcid ggplot2 导入了 scales 库,因此如果有人在使用 ggplot,那么他们已经安装了 scales 库。 - camille
显示剩余2条评论

89

你能将日期作为因子使用吗?

可以,但你可能不应该这样做。

...或者你应该对日期列使用 as.Date 函数?

是的。

这就引出了下面的问题:

library(scales)
df$Month <- as.Date(df$Month)
ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar(stat = "identity") +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User") +
  scale_x_date(labels = date_format("%m-%Y"))

这里输入图片描述

对于你的geom_bar函数调用,我添加了stat = "identity"

此外,binwidth的消息并不是一个错误。如果是错误信息,实际上会在其中包含“Error”字样,并且类似地,警告信息始终会包含“Warning”字样。否则,它只是一条普通消息。


非常准确。谢谢。我以前没见过stat = "identity"这个用法,现在要进一步研究一下了。谢谢。 - mikebmassey
@mikebmassey 关于 stat = "identity" 的基本要点是,如果你正在制作条形图,并且已经对数据进行了聚合,以便已经有了每个条形的高度,请使用它。 - joran
关于线图的后续处理:这只适用于条形图 - 我刚试着用 geom_line 插入相同的内容 - 无论是否使用 stat = "identity" - 都会出现警告 geom_path: Each group consist of only one observation. If I only have 1 data group, why would I need to group to make it work? Thanks。如果我只有一个数据组,为什么还需要分组才能使其正常工作?谢谢。 - mikebmassey
@mikebmassey 这有点复杂。基本上,虽然对于 来说很明显只有一个组,但是以这种方式编写 ggplot 代码,使其始终能够告知每个可能的数据集是否符合条件非常困难。因此,更安全地依赖用户输入来明确指定该信息。 - joran
2
Error in date_format("%m-%Y") : could not find function "date_format" - Peyman
1
@Peyman,你需要使用library(scales)来使用date_format - Eric Krantz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接