23

我的数据框是 z:

library(ggplot2); library(scales)
z <-     structure(list(Month = structure(c(14975, 15095, 15156, 15187, 
15248), class = "Date"), Value = c(1, 1, 1, 6, 1)), .Names = c("Month", 
"Value"), row.names = c(NA, 5L), class = "data.frame")


ggplot(z, aes(Month, Value)) + 
    geom_bar(fill="orange",size=.3,  stat="identity", position="identity") +
    geom_smooth(data=z,aes(Month,Value,group=1), method="lm", size=2, color="navyblue") + 
    scale_x_date(breaks = "1 month", labels=date_format("%b-%Y"))

这工作正常,但我真的很喜欢我的数据范围在 2011 年 1 月 1 日到 2013 年 1 月 1 日之间。我的示例日期是从 1/12011 到 10/1/2011。有没有一种简单的方法可以在 ggplot 中强制将日期范围从 2011 年 1 月 1 日到 2013 年 1 月 1 日?

4

3 回答 3

46

的文档?scale_x_date提到它接受所有“典型的”连续比例参数,包括limits

library(scales)
ggplot(z, aes(Month, Value)) + 
    geom_bar(fill="orange",size=.3,  stat="identity", position="identity") + 
    geom_smooth(data=z,aes(Month,Value,group=1), method="lm", size=2, color="navyblue") + 
    scale_x_date(date_breaks = "1 month", 
                 labels=date_format("%b-%Y"),
                 limits = as.Date(c('2011-01-01','2013-01-01')))
于 2013-01-04T18:43:06.553 回答
10

请注意,除了“ggplot2”之外,您还加载了scales包,这将是对 SO 用户的礼貌。有一个ggplot2::xlim功能,所以这有效:

  ...... + xlim(as.Date(c('1/1/2011', '1/1/2013'), format="%d/%m/%Y") )

更新:刚刚因为无法解释的原因投了反对票。原始问题中的代码不再有效,但如果您只用上面的 xlim() 调用替换 scale_x_date(.) 调用,则不会出现错误。

ggplot(z, aes(Month, Value)) + 
     geom_bar(fill="orange",size=.3,  stat="identity", position="identity") +
     geom_smooth(data=z,aes(Month,Value,group=1), method="lm", size=2, color="navyblue") + 
     xlim(as.Date(c('1/1/2011', '1/1/2013'), format="%d/%m/%Y") )

在此处输入图像描述

于 2013-01-04T18:45:47.753 回答
2

这是使用 ggplot 3.1 的解决方案,它需要对原始代码进行最少的调整:

ggplot(z, aes(Month, Value)) + 
    geom_bar(fill="orange",size=.3, stat="identity", position="identity") +
    geom_smooth(data=z,aes(Month,Value,group=1), method="lm", size=2, color="navyblue") + 
    scale_x_date(date_breaks = "1 month", 
           limits = as.Date(c('1/1/2011', '1/1/2013'), format="%d/%m/%Y"),
           date_labels="%b-%Y" ) +
    theme(axis.text.x = element_text(angle = 90))

最后theme()的 the 是可选的,但如果您想使用原始"%b-%Y"格式字符串,则格式更易于阅读。

于 2018-12-12T19:30:16.563 回答