R:如何用垂直线条划分时间?

时间:2017-06-20 08:58:51

标签: r datetime ggplot2

我是新的R用户。我希望在剧情中获得多个级别的垂直线条,如:

  • 按小时划分使用非常浅灰色的线条。

  • 每天打破使用浅灰色的线条。

  • 按周拆分使用灰色线条。

enter image description here

library(ggplot2)
library(lubridate)
library(scales)
ggplot(df,aes(x=df$DateTime,y=df$Val,ymin=0),xaxt="n") + 
  scale_x_datetime(labels = date_format("%m-%d"), breaks = date_breaks("days"), expand=c(0,0)) + 
  theme(text=element_text(size=10),
        legend.text=element_text(size=10),
        panel.background = element_rect(fill = "white", colour = "black")) +
  geom_line(lwd=1)

这里是示例df:

df <- read.table(text="
           DateTime,      Val
                 2017-06-13 00:00:00,5651.000
                 2017-06-13 01:00:00,5937.000
                 2017-06-13 02:00:00,5910.000
                 2017-06-13 03:00:00,5778.000
                 2017-06-13 04:00:00,5784.000
                 2017-06-13 05:00:00,5368.000
                 2017-06-13 06:00:00,5507.000
                 2017-06-13 07:00:00,5720.000
                 2017-06-13 08:00:00,6310.000
                 2017-06-13 09:00:00,6497.000
                 2017-06-13 10:00:00,6662.000
                 2017-06-13 11:00:00,6502.000
                 2017-06-13 12:00:00,6400.000
                 2017-06-13 13:00:00,6823.000
                 2017-06-13 14:00:00,6920.000
                 2017-06-13 15:00:00,6542.000
                 2017-06-13 16:00:00,6546.000
                 2017-06-13 17:00:00,5677.000
                 2017-06-13 18:00:00,5771.000
                 2017-06-13 19:00:00,5982.000
                 2017-06-13 20:00:00,6008.000
                 2017-06-13 21:00:00,6152.000
                 2017-06-13 22:00:00,6080.000
                 2017-06-13 23:00:00,5879.000
                 2017-06-14 00:00:00,5760.000
                 2017-06-14 01:00:00,5872.000
                 2017-06-14 02:00:00,5961.000
                 2017-06-14 03:00:00,5782.000
                 2017-06-14 04:00:00,5860.000
                 2017-06-14 05:00:00,5361.000
                 2017-06-14 06:00:00,5567.000
                 2017-06-14 07:00:00,5864.000
                 2017-06-14 08:00:00,6349.000
                 2017-06-14 09:00:00,6556.000
                 2017-06-14 10:00:00,6646.000
                 2017-06-14 11:00:00,6572.000
                 2017-06-14 12:00:00,6610.000
                 2017-06-14 13:00:00,6612.000
                 2017-06-14 14:00:00,6844.000
                 2017-06-14 15:00:00,6717.000
                 2017-06-14 16:00:00,6919.500
                 2017-06-14 17:00:00,6294.500
                 2017-06-14 18:00:00,5573.000
                 2017-06-14 19:00:00,5993.000
                 2017-06-14 20:00:00,6053.000
                 2017-06-14 21:00:00,6102.000
                 2017-06-14 22:00:00,6159.000
                 2017-06-14 23:00:00,6047.000
                 2017-06-15 00:00:00,5882.000
                 2017-06-15 01:00:00,5973.000
                 2017-06-15 02:00:00,6082.000
                 2017-06-15 03:00:00,5994.000
                 2017-06-15 04:00:00,5904.000
                 2017-06-15 05:00:00,5409.000
                 2017-06-15 06:00:00,5511.000
                 2017-06-15 07:00:00,5771.000
                 2017-06-15 08:00:00,6363.000
                 2017-06-15 09:00:00,6559.000
                 2017-06-15 10:00:00,6838.000
                 2017-06-15 11:00:00,6659.000
                 2017-06-15 12:00:00,6426.000
                 2017-06-15 13:00:00,6909.000
                 2017-06-15 14:00:00,6879.000
                 2017-06-15 15:00:00,6837.000
                 2017-06-15 16:00:00,6813.000
                 2017-06-15 17:00:00,6007.000
                 2017-06-15 18:00:00,6046.000
                 2017-06-15 19:00:00,6088.000
                 2017-06-15 20:00:00,6281.000
                 2017-06-15 21:00:00,6345.000
                 2017-06-15 22:00:00,6319.000
                 2017-06-15 23:00:00,6063.000
                 2017-06-16 00:00:00,5897.000
                 2017-06-16 01:00:00,6113.000
                 2017-06-16 02:00:00,6198.000
                 2017-06-16 03:00:00,6029.000
                 2017-06-16 04:00:00,5970.000
                 2017-06-16 05:00:00,5486.000
                 2017-06-16 06:00:00,5621.000
                 2017-06-16 07:00:00,5885.000
                 2017-06-16 08:00:00,6440.000
                 2017-06-16 09:00:00,6604.000
                 2017-06-16 10:00:00,6731.000
                 2017-06-16 11:00:00,6523.000
                 2017-06-16 12:00:00,6411.000
                 2017-06-16 13:00:00,6882.000
                 2017-06-16 14:00:00,6908.000
                 2017-06-16 15:00:00,6843.000
                 2017-06-16 16:00:00,6791.000
                 2017-06-16 17:00:00,5324.000
                 2017-06-16 18:00:00,5207.000
                 2017-06-16 19:00:00,5323.000
                 2017-06-16 20:00:00,6186.000
                 2017-06-16 21:00:00,6278.000
                 2017-06-16 22:00:00,6156.000
                 2017-06-16 23:00:00,6001.000
                 2017-06-17 00:00:00,5884.000
                 2017-06-17 01:00:00,6016.000
                 2017-06-17 02:00:00,5959.000
                 2017-06-17 03:00:00,5804.000
                 2017-06-17 04:00:00,5669.000
                 2017-06-17 05:00:00,4760.000
                 2017-06-17 06:00:00,4588.000
                 2017-06-17 07:00:00,4428.000
                 2017-06-17 08:00:00,4602.000
                 2017-06-17 09:00:00,4762.000
                 2017-06-17 10:00:00,4912.000
                 2017-06-17 11:00:00,4828.000
                 2017-06-17 12:00:00,4828.000
                 2017-06-17 13:00:00,4970.250
                 2017-06-17 14:00:00,4997.250
                 2017-06-17 15:00:00,4914.250
                 2017-06-17 16:00:00,4933.250
                 2017-06-17 17:00:00,4753.000
                 2017-06-17 18:00:00,4712.000
                 2017-06-17 19:00:00,3910.000
                 2017-06-17 20:00:00,3625.000
                 2017-06-17 21:00:00,3398.000
                 2017-06-17 22:00:00,3379.000
                 2017-06-17 23:00:00,3309.000
                 2017-06-18 00:00:00,3313.000
                 2017-06-18 01:00:00,3291.000
                 2017-06-18 02:00:00,3289.000
                 2017-06-18 03:00:00,3287.000
                 2017-06-18 04:00:00,3263.000
                 2017-06-18 05:00:00,3220.000
                 2017-06-18 06:00:00,3215.000
                 2017-06-18 07:00:00,2311.000
                 2017-06-18 08:00:00,1804.000
                 2017-06-18 09:00:00,1126.000
                 2017-06-18 10:00:00,931.000
                 2017-06-18 11:00:00,944.500
                 2017-06-18 12:00:00,965.500
                 2017-06-18 13:00:00,951.000
                 2017-06-18 14:00:00,972.000
                 2017-06-18 15:00:00,963.000
                 2017-06-18 16:00:00,949.000
                 2017-06-18 17:00:00,948.000
                 2017-06-18 18:00:00,941.000
                 2017-06-18 19:00:00,938.000
                 2017-06-18 20:00:00,932.000
                 2017-06-18 21:00:00,922.000
                 2017-06-18 22:00:00,935.000
                 2017-06-18 23:00:00,1011.231
                 2017-06-19 00:00:00,1022.231
                 2017-06-19 01:00:00,1017.231
                 2017-06-19 02:00:00,1020.231
                 2017-06-19 03:00:00,1020.231
                 2017-06-19 04:00:00,1101.231
                 2017-06-19 05:00:00,1912.231
                 2017-06-19 06:00:00,3530.231
                 2017-06-19 07:00:00,4894.231
                 2017-06-19 08:00:00,6238.231
                 2017-06-19 09:00:00,6523.231
                 2017-06-19 10:00:00,6502.231
                 2017-06-19 11:00:00,6408.231
                 2017-06-19 12:00:00,6275.000
                 2017-06-19 13:00:00,6760.000
                 2017-06-19 14:00:00,6804.000
                 2017-06-19 15:00:00,6943.000
                 2017-06-19 16:00:00,6935.000
                 2017-06-19 17:00:00,5984.000
                 2017-06-19 18:00:00,5754.000
                 2017-06-19 19:00:00,6086.000
                 2017-06-19 20:00:00,6219.000
                 2017-06-19 21:00:00,6206.000
                 2017-06-19 22:00:00,6172.000
                 2017-06-19 23:00:00,6029.000
                 2017-06-20 00:00:00,5836.000",sep=",",header=TRUE,stringsAsFactors=FALSE)
df$DateTime <- as.POSIXct(df$DateTime)

输出应该是这样的: enter image description here

我刚刚在Paint中编辑了哈哈。你可以看到我把非常轻的线条放在3个不同的等级上(平日开始时间为每周年&#39;星期一&#39;,日和小时)。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

首先,永远不要在df$..内使用aes,否则会导致ggplot2 non standard evaluation陷入困境。

我们可以使用主要和次要panel.grid来显示不同的垂直线。但是,这只能用于两个“级别”。

但我们也可以添加一个geom_vline(),它会添加一些垂直线:

library(ggplot2)
library(scales)

# Create the dataframe with the weeks interval
weeks <- data.frame(w = seq(min(df$DateTime), max(df$DateTime), 'week'))

ggplot(df) + 
    # plot line
    geom_line(aes(x = DateTime,y=Val)) +
    # plot vertical weekly lines
    geom_vline(data = weeks, 
               aes(xintercept = as.numeric(w)),
               color = 'grey55', size = 2) +
    scale_x_datetime(labels = date_format("%m-%d"),
                     breaks = date_breaks("days"),
                     # add minor breaks
                     minor_breaks = date_breaks("hours"),
                     expand = c(0,0)) +
    theme(text = element_text(size=10),
          legend.text = element_text(size=10),
          panel.background = element_rect(fill = "white", colour = "black"),
          # display daily grid
          panel.grid.major.x = element_line(color = 'grey75', size = 1),
          # display hourly grid
          panel.grid.minor.x = element_line(color = 'grey85', size = .1))