【问题标题】:X-axis duplicates for a time series using facet_wrap in ggplot使用 ggplot 中的 facet_wrap 为时间序列复制 X 轴
【发布时间】:2018-06-26 01:51:43
【问题描述】:

希望你今天过得愉快!所以,我有一个大约 20 年的大型数据集,我正在尝试使用 facet_wrap 参数来可视化它。以下是用于故障排除的数据的简化版本:

data <- data.frame(
Date = c("1993-06-09", "1993-08-16", "1993-09-13", "1993-10-11", "1993-11-08", "1994-03-06", "1994-05-20", "1994-07-12", "1994-12-06", "1994-09-07", "1995-04-04", "1995-01-07", "1995-02-06"),
Oxygen = c("15", "15.8", "15.3", "16", "16", "14.5", "14.9", "15.2", "15.7", "15", "12.6", "12.8", "13.5"),
Year = c("1993", "1993", "1993", "1993", "1993", "1994", "1994", "1994", "1994", "1994", "1995", "1995", "1995"),
Month = c("6", "8", "9", "10", "11", "3", "5", "7", "12", "9", "4", "1", "2"),
Day = c("9", "16", "13", "11", "8", "6", "20", "12", "6", "7", "4", "7", "6")
)

这是它周围的其余代码:

data$Oxygen <- as.numeric(as.character(data$Oxygen))
data$Year <- as.numeric(as.character(data$Year))
data$Month <- as.numeric(as.character(data$Month))
data$Day <- as.numeric(as.character(data$Day))
data$Date <- as.Date(data$Date)
ggplot(data = data, aes(x=Date, y=Oxygen)) + geom_point() + geom_smooth(method = "loess", se=FALSE) + facet_wrap( ~ Year, ncol=2) + scale_x_date(date_breaks = "1 month", date_labels = "%B")  + theme(axis.text.x=element_text(angle = 90, hjust = 1)) +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))

代码创建了这个图表:

我的问题在于 x 轴。如何更改它,使其不会为每年创建连续的几个月?我希望它适合一年的月份,而不是创造更多的月份,好像每年都不一样。

这就是我在余下时间里的样子:

它绘制的是每年的 x 轴,而不仅仅是一年的几个月。

最后,我如何告诉 ggplot 我想查看每个月内的一周或一天,以便并非所有点都集中在该月沿 x 轴的固定点上。

感谢您的宝贵时间!

【问题讨论】:

  • 选项facet_wrap( ~ Year, ncol=2, scales = "free_x") 是一个选项 - 它只会显示数据的月份
  • 不幸的是,@MelissaKey 我已经尝试了scales = "free_x" 选项,但效果并不好。你是对的,它只显示数据的月份,但我希望所有月份,即使在某些年份没有相应月份的值,也存在 - 只是不重复,但有多少年可用。

标签: r ggplot2 time-series facet-wrap


【解决方案1】:

要获得一致的月休,您可以创建一个日期虚拟变量,所有日期都具有相同的年份,并按实际年份分面。这样,您在 x 轴上仍然有一个日期,让您可以访问 scale_x_date,但可以按年份整齐地拆分数据。

为了简洁和偏好,我使用dplyr 进行了清理,并创建了一个虚拟日期列,将年份更改为 2018,然后使用lubridate::ymd 转换为日期对象。

library(tidyverse)
library(lubridate)

data2 <- data %>%
  mutate_at(vars(-Date), function(x) as.numeric(as.character(x))) %>%
  mutate(Date = as.Date(Date)) %>%
  mutate(dummy_date = paste("2018", Month, Day) %>% ymd())


ggplot(data2, aes(x = dummy_date, y = Oxygen, group = Year)) +
  geom_point() +
  geom_smooth(method = loess, se = FALSE) +
  scale_x_date(date_breaks = "1 month", date_labels = "%B") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  facet_wrap(~ Year, ncol = 2)

reprex package (v0.2.0) 于 2018 年 6 月 25 日创建。

【讨论】:

    【解决方案2】:

    选项 1:(从 cmets 重述)- 使用 facet_wrap 仅显示相关的时间窗口。

    ggplot(data = data, aes(x=Month, y=Oxygen)) + 
      geom_point() + 
      geom_smooth(method = "loess", se=FALSE) + 
      facet_wrap( ~ Year, ncol=2, scales = 'free_x') + 
      scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
      theme(
        axis.text.x=element_text(angle = 90, hjust = 1),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour = "black")
      )
    

    选项2:使用Month作为x轴:

    ggplot(data = data, aes(x=Month, y=Oxygen)) + 
      geom_point() + 
      geom_smooth(method = "loess", se=FALSE) + 
      facet_wrap( ~ Year, ncol=2) + 
      scale_x_continuous(name = "Date", breaks = 1:12, labels = month.name) + 
      # scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
      theme(
        axis.text.x=element_text(angle = 90, hjust = 1),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour = "black")
      )
    

    我不怎么处理日期,所以这是一个 hack - 但它可能足够好,直到/除非有人提出一个好的解决方案。

    ggplot(data = data, aes(x=Month + pmin(Day/30, 1), y=Oxygen)) + 
      geom_point() + 
      geom_smooth(method = "loess", se=FALSE) + 
      facet_wrap( ~ Year, ncol=2) + 
      scale_x_continuous(name = "Date", breaks = 1:12, labels = month.name) + 
      # scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
      theme(
        axis.text.x=element_text(angle = 90, hjust = 1),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour = "black")
      )
    

    【讨论】:

    • 在 ggplot 中是否对选项 2 进行了一些修改,以使这些点不只是在一个月内,而不是在中间的某个地方建议一个月内的某个时间?目前,数据点表明这一切都发生在每个月的第一天。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2020-07-01
    • 1970-01-01
    • 2021-06-10
    • 2021-03-07
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多