Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用ggplot绘制临时标记覆盖率_R_Plot_Ggplot2 - Fatal编程技术网

R 使用ggplot绘制临时标记覆盖率

R 使用ggplot绘制临时标记覆盖率,r,plot,ggplot2,R,Plot,Ggplot2,我试图重现一个情节,它可视化了一组电子标签的时间跨度,但收效甚微。我附上了一个简单的例子,说明了我想要绘制的图以及构成该图的数据。使用ggplot生成此绘图的任何帮助都将非常有用 请注意,在我不关心年份的绘图中,我只想可视化标签记录数据的日期和月份。还要注意的是,对于像4120这样的标签,它们在年底(9月)发布,并持续到下一年年初(4月)生成数据,该条持续到年底,然后有另一条从1月开始的条,并可视化标签记录的其余部分 dat <- structure(list(Tag_Num = c(44

我试图重现一个情节,它可视化了一组电子标签的时间跨度,但收效甚微。我附上了一个简单的例子,说明了我想要绘制的图以及构成该图的数据。使用ggplot生成此绘图的任何帮助都将非常有用

请注意,在我不关心年份的绘图中,我只想可视化标签记录数据的日期和月份。还要注意的是,对于像4120这样的标签,它们在年底(9月)发布,并持续到下一年年初(4月)生成数据,该条持续到年底,然后有另一条从1月开始的条,并可视化标签记录的其余部分

dat <- structure(list(Tag_Num = c(44386L, 44387L, 44388L, 44390L, 52236L, 
52237L, 52238L, 60639L, 60641L, 61921L, 61925L, 61932L, 61936L, 
61938L, 61940L, 61957L, 63975L, 63977L, 87565L, 100949L), Deploy = structure(c(1L, 
3L, 2L, 9L, 5L, 7L, 14L, 6L, 4L, 13L, 15L, 20L, 10L, 12L, 8L, 
19L, 16L, 11L, 18L, 17L), .Label = c("5/4/2004", "5/5/2004", 
"5/6/2004", "6/22/2011", "6/24/2005", "6/24/2011", "6/26/2005", 
"6/30/2006", "7/3/2004", "9/1/2006", "9/10/2007", "9/11/2007", 
"9/12/2006", "9/15/2007", "9/21/2006", "9/22/2006", "9/24/2010", 
"9/6/2008", "9/7/2006", "9/9/2006"), class = "factor"), Recover = structure(c(14L, 
14L, 14L, 2L, 18L, 17L, 3L, 16L, 15L, 7L, 4L, 12L, 9L, 6L, 13L, 
8L, 5L, 11L, 1L, 10L), .Label = c("12/20/2008", "12/31/2004", 
"3/14/2008", "3/21/2007", "4/18/2007", "5/12/2008", "5/15/2007", 
"5/16/2007", "5/21/2007", "5/22/2011", "5/8/2008", "5/9/2007", 
"7/26/2006", "9/10/2004", "9/20/2011", "9/22/2011", "9/25/2005", 
"9/8/2005"), class = "factor")), .Names = c("Tag_Num", "Deploy", 
"Recover"), class = "data.frame", row.names = c(NA, -20L))

dat我找到了一个解决方案,尽管我最终依靠朱利安的日期来实现这一点。我严重依赖lubridate、dplyr和ggplot2软件包

我花了很长时间弄清楚数据集应该是什么样子。如果你只有这五点,你可以很容易地第二排4120。下面是一种使用
dplyr
中的
do
对整个数据集执行此操作的方法

require(dplyr)
require(lubridate)

dat2 = dat %>%
    group_by(Tag_Num) %>%
    do(if(year(mdy(.$Deploy)) - year(mdy(.$Recover)) != 0) {
        data.frame(Deploy = c(as.character(.$Deploy), paste("1/1", year(mdy(.$Recover)), sep = "/")), 
                  Recover = c(paste("12/31", year(mdy(.$Deploy)), sep = "/"), as.character(.$Recover))) }
        else { data.frame(Deploy = .$Deploy, Recover = .$Recover) } )
现在,数据集看起来像:

我将实际绘图转换为Julian Day部署和恢复日期。我也加入了部署年份,所以从技术上讲,你可以在情节中做一些类似于逐年着色的事情

dat2 = dat2 %>% ungroup %>% 
    mutate(year = year(mdy(Deploy)), JDeploy = yday(mdy(Deploy)), 
          JRecover = yday(mdy(Recover)), Tag_Num = factor(Tag_Num))
为了将月份放在x轴上而不是朱利安日,我计算出了每个月中的大约朱利安日,用作轴中断。这对我来说似乎有点老套,但不确定如何定义休息

# Make breaks in Julian Day that will be equivalent to essentially midmonth?
xbreaks = yday(paste(2013, 1:12, c(15, 14, rep(15, 10)), sep = "-"))
# If want labels at start of each month rather than midmonth
xbreaks2 = yday(paste(2013, 1:12, 1, sep = "-"))
然后用ggplot2绘图。这依赖于在
geom\u段中使用系数
Tag\u Num
as.numeric
。然后用
Tag\u Num
的级别设置y轴断裂标签。您可以通过更改数据集中
Tag_Num
级别的顺序来更改y轴的顺序

编辑

对于更多标记,默认情况下y轴上的数字分隔符不再表示每个唯一标记(请参见OP中的更新数据集)。您可以通过在
scale\u y\u continuous
中设置
断点来解决此问题

require(ggplot2)

ggplot(dat2, aes(x = JDeploy, xend = JRecover, y = as.numeric(Tag_Num), yend = as.numeric(Tag_Num))) +
    geom_segment(size = 5) +
    scale_y_continuous(breaks = unique(as.numeric(dat2$Tag_Num)), labels = paste("Tag", levels(dat2$Tag_Num))) + 
    ylab(NULL) + 
    xlab(NULL) +
    scale_x_continuous(breaks = xbreaks2, labels = format(ISOdate(2004,1:12,1),"%b"))

这段代码非常接近于生成我需要的内容。我的原始帖子中包含的简单数据集是我正在研究的两种物种中的一种。另一个物种更复杂,数据集更大。当将上述代码应用于第二个物种时,出现了一些错误,数据被修改,不再正确绘制。我不明白为什么这会发生在第二个物种而不是第一个物种上。我已经编辑了我的帖子,现在包含了第二个物种的数据集。如果您能帮助代码处理这第二个物种,我们将不胜感激。@2ton21啊,是的,我想我明白了。我没有想到如果有更多的标签,我需要在y轴上设置
断点
,这样每个标签都会被表示出来。上面进行了相应的编辑。是的,你完全正确,这确实修复了轴,但我指的是两个标签,它们的数据出来时有点不对劲。例如,标记61938在9月的第二周被标记,并在5月的第二周恢复,但在图中,它看起来像是在8月底被标记,并在4月的最后几天恢复。我认为这是由x轴上的断裂/标记引起的,但我不知道如何修复它。很抱歉这么迂腐,但如果它的工作将是非常有用的东西,我继续我的工作。再次感谢@2To21记得我把这些断言定义为“月中”,所以标签设置在每个月的中间(见<代码>粘贴>代码>代码,当我创建<代码> XStult< /Cord>)。月份之间的次要网格线或多或少表示月份的开始/结束。如果您希望在每个月初添加标签,只需将
xbreaks
重新定义为1号,而不是14/15号。
# Make breaks in Julian Day that will be equivalent to essentially midmonth?
xbreaks = yday(paste(2013, 1:12, c(15, 14, rep(15, 10)), sep = "-"))
# If want labels at start of each month rather than midmonth
xbreaks2 = yday(paste(2013, 1:12, 1, sep = "-"))
require(ggplot2)

ggplot(dat2, aes(x = JDeploy, xend = JRecover, y = as.numeric(Tag_Num), yend = as.numeric(Tag_Num))) +
    geom_segment(size = 5) +
    scale_y_continuous(breaks = unique(as.numeric(dat2$Tag_Num)), labels = paste("Tag", levels(dat2$Tag_Num))) + 
    ylab(NULL) + 
    xlab(NULL) +
    scale_x_continuous(breaks = xbreaks2, labels = format(ISOdate(2004,1:12,1),"%b"))