首页 文章

X轴在ggplot中使用facet_wrap复制时间序列

提问于
浏览
0

我希望你过得愉快!所以,我有一个大的数据集大约二十年,我正在尝试使用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"))

代码创建此图:

img

我的问题是x轴 . 如何更改它,以便它不是每年都会连续几个月创建连续几个月?我希望它能够在一年内完全适应一年而不是创造更多月份,就像每年都不同 .

这就是我在剩下的几年里看起来的样子:

img

它绘制的是每年的x轴而不是单年的月值 .

最后,我如何告诉ggplot我想要查看每个月内的一周或一天,以便不是所有的点都集中在沿着x轴的那个月的固定点上 .

感谢您的时间!

2 回答

  • 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-06-25 .

  • 0

    选项1 :(从评论中重申) - 使用 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")
      )
    

    我对日期工作不多,所以这是一个黑客 - 但它可能足够好直到/除非有人展示了一个好的解决方案 .

    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")
      )
    

相关问题