在ggplot2和R中中断scale_x_date

时间:2011-07-10 02:00:43

标签: r ggplot2

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

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

enter image description here

1 个答案:

答案 0 :(得分:13)

一种方法是将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)