我在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
答案 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)