这是我第一次使用SO而且我是R新手;对不起,如果这有点基本或不清楚(或者如果问题已经得到解答......我正在努力编码,需要非常具体的答案才能理解)
我想制作一个与此类似的图像:
除了我希望它在时间轴上水平定向,并且从x轴绘制两条垂直线。
我可以简单地设置数据,并且只有两个变量 - date和Tag。
Tag Date
1 1 1/1/2014
2 3 1/1/2014
3 1 1/3/2014
4 2 1/3/2014
5 3 1/3/2014
6 5 1/3/2014
7 2 1/4/2015
8 3 1/4/2015
9 4 1/4/2015
10 6 1/4/2015
11 1 1/5/2014
12 2 1/5/2014
13 4 1/5/2014
14 6 1/5/2014
15 1 1/6/2014
16 2 1/6/2014
17 3 1/6/2014
18 4 1/6/2014
19 6 1/6/2014
20 2 1/7/2014
21 4 1/7/2014
22 1 1/8/2014
23 2 1/8/2014
24 6 1/8/2014
以下是我想要完成的绘制图像:
回顾一下 - 我想获取这些数据,该数据显示在某个位置检测动物的日期,并将其绘制在两个日期有两条垂直线的时间轴上。如果连续几天检测到一只动物(比如标记2),我想用一条线连接这些日期,如果检测在连续几天没有检测到,那么一个简单的点就足够了。我想是y轴与每个单独的标签堆叠,x轴是日期标度 - 对于每个日期,如果检测到A标签ID,则将标记其对应的x,y坐标;如果在某个日期没有检测到标签;相应的x,y坐标将保持空白。
以下是一个后续问题:
我想为某些日期添加阴影背景。我想我可以使用geom_rect
使用它,但我不断收到以下错误:
Error: Invalid input: date_trans works with objects of class Date only
使用您编写的代码,这是我为收到错误而添加的内容:
geom_rect(aes(xmin=16075, xmax=16078, ymin=-Inf, ymax=Inf), fill="red", alpha=0.25)
此代码将绘制,但不透明,因此变得相当无用:
geom_rect(xmin=16075, xmax=16078, ymin=-Inf, ymax=Inf)
答案 0 :(得分:2)
您首先需要将日期格式更改为Date
。然后你需要弄清楚日期是否连续。最后你需要绘制它们。以下是使用包dplyr
和ggplot2
的可能解决方案。
# needed packages
require(ggplot2)
require(dplyr)
# input your data (changed to 2014 dates)
dat <- structure(list(Tag = c(1L, 3L, 1L, 2L, 3L, 5L, 2L, 3L, 4L, 6L, 1L, 2L, 4L, 6L, 1L, 2L, 3L, 4L, 6L, 2L, 4L, 1L, 2L, 6L), Date = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L), .Label = c("1/1/2014", "1/3/2014", "1/4/2014", "1/5/2014", "1/6/2014", "1/7/2014", "1/8/2014"), class = "factor")), .Names = c("Tag", "Date"), class = "data.frame", row.names = c(NA, -24L))
# change date to Date format
dat[, "Date"] <- as.Date(dat[, "Date"], format='%m/%d/%Y')
# adding consecutive tag for first day of cons. measurements
dat <- dat %>% group_by(Tag) %>% mutate(consecutive=c(diff(Date), 2)==1)
# plotting command
ggplot(dat, aes(Date, Tag)) + geom_point() + theme_bw() +
geom_line(aes(alpha=consecutive, group=Tag)) +
scale_alpha_manual(values=c(0, 1), breaks=c(FALSE, TRUE), guide='none')