我正在尝试绘制血压数据,以便在一天(一小时到一小时)内,每周一天内查看我可以看到的情节。这是我期待的原型图。
我需要自动化绘图,生成数据的应用程序将采用以下格式:
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
我不确定如何识别天的名称以及如何将网格线放在需要的位置?
答案 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"))
修改强> 采取@ 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)
我将次要网格线间隔设置为6小时,否则图形会因垂直线而变得非常拥挤,但您可以根据自己的喜好进行更改。