【问题标题】:Breaks for scale_x_date in ggplot2 and Rggplot2 和 R 中 scale_x_date 的中断
【发布时间】:2011-10-02 02:15:57
【问题描述】:

我在 ggplot2(在 R 中)中绘制 value~date。我有以下代码。如您所见,ggplot2 在我的数据中的 x 轴上添加了更多中断。每当我的数据框中有一个数据点时,我只想拥有 x-label。如何强制 ggplot2 仅在 my.dates 的值处显示中断? scale_x_date 似乎没有“中断”参数

require(ggplot2)
my.dates = as.Date(c("2011-07-22","2011-07-23",
                     "2011-07-24","2011-07-28","2011-07-29"))
my.vals  = c(5,6,8,7,3)
my.data <- data.frame(date =my.dates, vals = my.vals)
plot(my.dates, my.vals)
p <- ggplot(data = my.data, aes(date,vals))+ geom_line(size = 1.5)
p <- p + scale_x_date(format="%m/%d", ' ')
p

【问题讨论】:

  • 另见scale_x_date():“日期刻度将尝试为主要和次要刻度线选择合理的默认值。用 date_breaks、date_labels、date_minor_breaks 参数覆盖。”

标签: r ggplot2


【解决方案1】:

一种方法是将 x 轴视为数字,并使用scale_x_continuous() 设置中断和标签美学。

ggplot(my.data, aes(as.numeric(date), vals)) + 
  geom_line(size = 1.5) +
  scale_x_continuous(breaks = as.numeric(my.data$date)
                     , labels = format(my.data$date, format = "%m/%d"))

虽然我认为 7/24 到 7/28 之间的休息时间看起来有点奇怪。但是,我认为这就是你想要的?如果我误解了,请告诉我。

编辑

如上所述,我对上面的中断看起来并不感到兴奋,特别是背景中的灰色网格。这是维护矩形网格并仅标记我们拥有数据的点的一种方法。你可以在 ggplot 调用中完成这一切,但我认为在 ggplot 之外进行处理更容易。首先,创建一个包含与日期对应的数字序列的向量。然后我们将更新适当的标签并将 NA 条目替换为 " " 以防止在 x 轴上为这些条目绘制任何内容:

xscale <- data.frame(breaks = seq(min(as.numeric(my.data$date)), max(as.numeric(my.data$date)))
                      , labels = NA)

xscale$labels[xscale$breaks %in% as.numeric(my.data$date)] <- format(my.data$date, format = "%m/%d") 
xscale$labels[is.na(xscale$labels)] <- " "

这给了我们一些看起来像:

  breaks labels
1  15177  07/22
2  15178  07/23
3  15179  07/24
4  15180       
5  15181       
6  15182       
7  15183  07/28
8  15184  07/29

然后可以像这样传递给秤:

scale_x_continuous(breaks = xscale$breaks, labels = xscale$labels)

【讨论】:

  • 非常感谢。第一部分解决了我的问题。您是否知道我如何保持 x 轴中断但删除其网格线?
  • @Mark - opts(panel.grid.major = theme_blank(), panel.grid.minor = theme_blank()) 应该可以解决问题。
  • ggplot2 1.0.0 中抛出Error: Discrete value supplied to continuous scale
  • @MYaseen208 - 适合我。您可能需要单独加载scales 包。一般来说 - 互联网上的解决方案有一个有限的时间框架,目前已经有 3.5 年的历史了;如果您愿意,请随时修改答案以更新它。任何明显坏掉的东西都不能那个坏掉。
  • 我收到与@MYaseen208 相同的错误,并且我已加载秤
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多