【问题标题】:Editing axis tick labels with ggplot2 when x-axis is mm-dd当 x 轴为 mm-dd 时,使用 ggplot2 编辑轴刻度标签
【发布时间】:2014-10-07 12:19:06
【问题描述】:

我有一个数据集,其中 x 轴是日期,但它只是 mm-dd(没有年份)。我使用年份作为组变量,因为我试图在同一图上显示 YOY 变化。 x 轴标签太拥挤,我想限制刻度线标签,以便不显示每个日期。这可能是每隔一天、每隔三天、一周一天——这些都行。

我尝试了一些解决方案,但无法让它们发挥作用,我假设是因为我的 x 轴不是日期,而是一个字符。 (在为 x 轴找到这个 mm-dd 解决方案之前,我尝试使用 yyyy-mm-dd 日期格式绘制 x 轴,但没有成功弄清楚如何让 ggplot2 忽略“yyyy”部分.)

一个例子:

myDF <- data.frame(
        myDate = format(seq(as.Date("2014-02-01"), 
                 length=28, by="1 day"), "%m-%d"),
        myVar = sample(100,28),
        myGroup = sample(2,28,TRUE)
                   )
head(myDF)

  myDate myVar myGroup
  02-01    87       1
  02-02    34       1
  02-03    48       2
  02-04    59       1
  02-05    98       1
  02-06    18       2

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() 

我试过了:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) +   
geom_line() + scale_x_discrete(breaks = c(1,10,20))

这似乎使 ggplot 感到困惑,因为标签完全消失了。 (与 seq() 尝试的结果相同。)

我也试过了:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() + scale_x_date(breaks = "1 week")

这会引发错误:myDate not be a Date。

我已经将刻度标签的格式切换为垂直,但是在情节上还是太拥挤了。

任何提示将不胜感激。谢谢!

【问题讨论】:

  • 啊。这又是旧的as.data.frame(cbind(.)) 错误。 cbind 强制所有内容。如果你想要日期,那么不要用format 强制字符。
  • as.data.frame(cbind(.)) 不在我的原始代码中,它只是为了快速而肮脏的示例。我在我的问题中承认 mm-dd 变量不再是日期,并且我解释了我是如何达到这种格式的。我并不声称这是做事的正确方式——这就是我在这里的原因。
  • 如果您花时间阅读了?scale_x_date 的帮助文本,这是您使用的一个函数,那么您会发现几个关于如何“控制标签格式以及[...] 标记的频率”。
  • 我确实读过 ?scale_x_date。它需要日期。我的 mm-dd 不是日期。如果您说 mm-dd 可以是日期,请分享您的知识。我的所有研究都让我相信,日期至少需要 ymd。如果您改为说我可以将 scale_x_date() 与 yyyy-mm-dd Date var 一起使用,以便我在同一水平空间中有两行,有效地忽略 yyyy,请也分享您的知识。只有对我不理解的其他一些美学进行额外的调整,它才会在那种情况下相关。

标签: r plot ggplot2 character lubridate


【解决方案1】:

如果您想使用不带年份(作为字符)的myDate 变量,那么一种解决方案是使用scale_x_discrete(),然后提供myDF$myDate 作为breaks= 参数并选择要显示的值序列。在这个例子中,我选择了每 7 个值。

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) +   
      geom_line() + scale_x_discrete(breaks = unique(myDF$myDate)[seq(1,28,7)])

【讨论】:

  • 非常感谢!我想这可能是我对 scale_x_discrete 的误解。这完美地工作。谢谢!
  • PS 很抱歉,我现在不能投票 - 我会努力提高我的声誉,以便我可以回来投票。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2013-12-30
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多