R - ggplot2时间序列x轴显示每月最后一天

7
为什么ggplot总是给我每个月的第一天,然后绘制时间序列图。
以下是我的代码示例:
library(ggplot2)
library(dplyr)
date <- as.Date(c("2008-01-31",
"2008-02-29",
"2008-03-31",
"2008-04-30",
"2008-05-31"))


count <- sample(5)
df <- data.frame(date = date, count = count)
df %>% 
  ggplot(aes(x = date, y = count))+
  geom_line()+
  scale_x_date(date_breaks = "1 month",
               date_labels = '%m/%d')  

我希望X轴能够显示来自df的实际日期或月底最后一天。但是它显示的是下个月的第一天。我试着搜索了一下,但没有找到可适用的解决方案。
谢谢。
3个回答

6
也许最简单的解决方案就是使用 breaks 而不是 date_breaks,直接引用数据框中的日期列。
df %>% 
  ggplot(aes(x = date, y = count))+
  geom_line()+
  scale_x_date(date_labels = '%m/%d', breaks = df$date)

enter image description here


4

删除 date_breaks 并添加 breaks = df$date 似乎可以得到所需的结果。

df <- data.frame(date = as.POSIXct(date), count = count)
df %>% 
  ggplot(aes(x = date, y = count)) +
  geom_line() +
  scale_x_datetime(breaks = df$date, date_labels = '%m/%d') 

enter image description here


4
你和ggplot的对日期的理解方式不同。
你认为日期像标签一样。在你的例子中,你有5个东西,你想按顺序绘制它们,并且这些标签应该出现在轴上。 ggplot把日期看作是日期。如果你只提供了值2和5,因为它们是数字,它会添加它们之间的所有点,例如2.5、3、4等。由于你已经给出了日期,它也将在其中插入所有日期。
轴标签超出了轴的范围,并且与变量无关。它把日期放在正确的位置,但是选择了轴标签本身。
这让你有两个选择:
1.
如果你想继续使用"Date"数据类型,可以用breaks来替换date_break选项,并指定想要的范围。例如:
scale_x_date(breaks = seq(min(date),max(date),by="month"),
             date_labels = '%m/%d')

如果你想将它们作为标签(例如,你不想在这些日期之间放置任何点),可以考虑将date转换为因子(factor),然后只需绘制它即可。
date <- factor(c("2008-01-31",
              "2008-02-29",
              "2008-03-31",
              "2008-04-30",
              "2008-05-31"))

count <- sample(5)
df <- data.frame(date = date, count = count)
df %>% 
  ggplot(aes(x = as.numeric(date), y = count))+
  geom_line() +
  scale_x_continuous(labels=format(as.Date(date), "%m/%d"))

在参数中使用as.numeric将日期转换为数字(这样它就可以在之间绘制一条线),然后我们只需要将标签设置为我们想要的内容,这需要将其转换为日期,然后格式化为月/日。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接