R每天绘制多个观察值

R plot multiple observations per day

我一直在努力创建一个时间序列点图(不是箱线图)来容纳下面显示的每天有多个数据点的程式化数据。

数据稀疏,并且在日期范围内的许多天都会缺少数据,但是有些天可能有数百个数据点在一个狭窄的值范围内。 x 轴必须跨越整个日期范围并包括漂亮的刻度线,即使对于没有任何数据的日子也是如此。

如果 x 轴标签垂直放置,y 轴标签水平放置,我会很好。

我一直在寻求帮助并四处搜索,并花了数小时使用 ggplot2、ts()、axis() 设置等,但没有成功。 x轴尤其有问题。

看起来这应该很容易,但我是一个R菜鸟。

dt,     RotMarks  
2017-01-01,    1  
2017-01-01,    3  
2017-03-10,    2  
2017-03-10,    4  
2017-03-10,    6  
2017-06-15,    10  
2017-06-15,    15  
2017-09-20,    1  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    12  
2017-10-31,    4  
2017-10-31,    4  
2017-10-31,    4  
2017-10-31,    4  
2017-10-31,    1  
2017-10-31,    1  
2017-10-31,    1  
2017-10-31,    1  
2017-12-31,    1  
2017-12-31,    1  
2017-12-31,    1  

使用 包的解决方案。我不认为用每个日期标记 x 轴是个好主意,因为它太拥挤了。可以看到示例中使用了日期分隔符为“2周”,已经有点拥挤了。 date_labels = "%Y-%m-%d"是指定日期格式。 axis.text.x = element_text(angle = 90, hjust = 1) 是垂直放置 x 标签。

library(tidyverse)

# Expand the data frame to full sequence of dates    
dat2 <- dat %>%
  mutate(dt = as.Date(dt)) %>%
  complete(dt = full_seq(dt, period = 1))

ggplot(dat2, aes(x = dt, y = RotMarks)) +
  geom_point() +
  scale_x_date(name = "Date", 
               date_labels = "%Y-%m-%d", 
               date_breaks = "2 weeks") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

数据

dat <- read.csv(text = "dt,     RotMarks  
2017-01-01,    1  
                 2017-01-01,    3  
                 2017-03-10,    2  
                 2017-03-10,    4  
                 2017-03-10,    6  
                 2017-06-15,    10  
                 2017-06-15,    15  
                 2017-09-20,    1  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    12  
                 2017-10-31,    4  
                 2017-10-31,    4  
                 2017-10-31,    4  
                 2017-10-31,    4  
                 2017-10-31,    1  
                 2017-10-31,    1  
                 2017-10-31,    1  
                 2017-10-31,    1  
                 2017-12-31,    1  
                 2017-12-31,    1  
                 2017-12-31,    1",
                 header = TRUE, stringsAsFactors = FALSE)