在r中绘制每日和每周变化日期数据

时间:2014-12-12 16:13:00

标签: r plot ggplot2 time-series

我正在尝试绘制血压数据,以便在一天(一小时到一小时)内,每周一天内查看我可以看到的情节。这是我期待的原型图。

enter image description here

我需要自动化绘图,生成数据的应用程序将采用以下格式:

    mydHeart <- data.frame (datetime = paste("12/", rep(1:10, each=4), "/14 ", 
  rep(c("14:14:00", "12:15:00", "18:15:14", "22:15:14"), 4), " PM", sep=""), 
systolic = round(rnorm(40, 120, 5),0), distolic= round(rnorm(40, 80, 3),0))

                   datetime systolic distolic
    1   12/1/14 14:14:00 PM      126       76
    2   12/1/14 12:15:00 PM      126       79
    3   12/1/14 18:15:14 PM      122       79
    4   12/1/14 22:15:14 PM      130       84
    5   12/2/14 14:14:00 PM      122       80
    6   12/2/14 12:15:00 PM      120       79
    7   12/2/14 18:15:14 PM      119       82
    8   12/2/14 22:15:14 PM      126       80
    9   12/3/14 14:14:00 PM      123       81
    10  12/3/14 12:15:00 PM      122       84
    11  12/3/14 18:15:14 PM      126       79
    12  12/3/14 22:15:14 PM      122       78
    13  12/4/14 14:14:00 PM      128       74
    14  12/4/14 12:15:00 PM      114       81
    15  12/4/14 18:15:14 PM      122       84
    16  12/4/14 22:15:14 PM      114       81
    17  12/5/14 14:14:00 PM      126       79
    18  12/5/14 12:15:00 PM      121       77
    19  12/5/14 18:15:14 PM      125       86
    20  12/5/14 22:15:14 PM      128       79
    21  12/6/14 14:14:00 PM      114       86
    22  12/6/14 12:15:00 PM      129       81
    23  12/6/14 18:15:14 PM      117       80
    24  12/6/14 22:15:14 PM      126       82
    25  12/7/14 14:14:00 PM      118       88
    26  12/7/14 12:15:00 PM      114       81
    27  12/7/14 18:15:14 PM      124       79
    28  12/7/14 22:15:14 PM      120       76
    29  12/8/14 14:14:00 PM      119       79
    30  12/8/14 12:15:00 PM      114       79
    31  12/8/14 18:15:14 PM      117       85
    32  12/8/14 22:15:14 PM      117       78
    33  12/9/14 14:14:00 PM      120       78
    34  12/9/14 12:15:00 PM      126       83
    35  12/9/14 18:15:14 PM      121       79
    36  12/9/14 22:15:14 PM      119       78
    37 12/10/14 14:14:00 PM      118       79
    38 12/10/14 12:15:00 PM      128       78
    39 12/10/14 18:15:14 PM      133       81
    40 12/10/14 22:15:14 PM      116       81

我正在尝试基准日期转换设施,但以下代码会产生有趣的情节。

plot(as.Date(mydHeart[,1]), mydHeart[,2], type = "l")

我试过跟随但是出错了,我不知道如何在R中输入上述日期样式。

    plot(as.Date(mydHeart[,1], '%m-%d-%y'), mydHeart[,2], type = "l")

Error in plot.window(...) : need finite 'xlim' values
In addition: Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf

我不确定如何识别天的名称以及如何将网格线放在需要的位置?

1 个答案:

答案 0 :(得分:7)

以下是我如何做到这一点:

mydHeart$datetime <- as.character(mydHeart$datetime)
library(lubridate)
library(reshape2)
library(ggplot2)
library(scales)
##
mydHeart$datetime <- lubridate::mdy_hms(
  sub("(\\s[A-Z]+)","",mydHeart$datetime))
##
> str(mydHeart)
'data.frame':   40 obs. of  3 variables:
 $ datetime: POSIXct, format: "2014-12-01 14:14:00" ...
 $ systolic: num  120 121 114 122 113 114 120 117 116 126 ...
 $ distolic: num  80 76 83 81 84 79 80 81 83 77 ...

以上内容会使您的datetime列格式正确;从这里我会melt你的数据并用ggplot2创建一个图而不是使用R的基本图形,但你可能更喜欢基础图。

mData <- melt(
  mydHeart,
  id.vars="datetime",
  variable.name="bp_type",
  value.name="blood_pressure")
##
ggplot(
  mData,
  aes(x=datetime,y=blood_pressure,
      color=bp_type))+
  geom_line()+
  scale_x_datetime(
  labels=date_format("%a %m/%d"))

enter image description here

修改 采取@ eipi10的建议,稍作修改:

ggplot(
  mData,
  aes(x=datetime,y=blood_pressure,
      color=bp_type))+
  theme_bw()+
  scale_x_datetime(
    breaks="1 day", 
    minor_breaks="6 hours") + 
  coord_cartesian(
    xlim=c(mdy_hms("11/30/14 12:00:00"),
           mdy_hms("12/10/14 00:00:00")))+
  theme(
    panel.grid.minor.x=element_line(
      colour="grey30", linetype="11"),
    panel.grid.major.x=element_line(
      colour="black"))+
  geom_line(size=1.1)

enter image description here

我将次要网格线间隔设置为6小时,否则图形会因垂直线而变得非常拥挤,但您可以根据自己的喜好进行更改。