从ggplot中提取一个点并绘制它

时间:2015-07-24 10:49:19

标签: r ggplot2

我最初拥有如下所示的数据集:

ID  A    B  Type  Time  Date
1  12    13   R  23:20 1-1-01
1  13    12   F  23:40 1-1-01
1  13    11   F  00:00 2-1-01
1  15    10   R  00:20 2-1-01
1  12    06   W  00:40 2-1-01
1  11    09   F  01:00 2-1-01
1  12    10   R  01:20 2-1-01
so on...

我尝试为A和B制作上述数据集的ggplot。

ggplot(data=dataframe, aes(x=A, y=B, colour = Type)) +geom_point()+geom_path()

问题:

  1. 如何添加一个子集变量,用于查看每个F'之后的前24小时。点。

  2. 目前我已经发布了[关于时间]的连续数据集,但我的原始数据集不是连续的。如何在10分钟的间隔内连续设置数据?我在A和B上使用了插值xspline()函数,但我不知道如何使我的数据集在时间上连续,

  3. 下面显示的突出显示部分是我正在寻找的,我想提取这个数据集,然后绘制一个新的ggplot:

    来自MarkusN的情节这就是我要找的东西:

    以第一点作为' F'从这一点开始24小时起点和行驶(因为这里没有24小时的数据集,所以它应该像这样产生):

    Image

2 个答案:

答案 0 :(得分:2)

我尝试了以下内容,也许你可以从这里得到一个想法。我建议你先订购一个带有订购时间的变量(以分钟或小时为单位,在本例中我用了几个小时)。让我们看看它是否有帮助

#a data set is built as an example
N = 100
set.seed(1)
dataframe = data.frame(A = cumsum(rnorm(N)),
                       B = cumsum(rnorm(N)),
                       Type = sample(c('R','F','W'), size = N, 
                                     prob  = c(5/7,1/7,1/7), replace=T),
                       time.h = seq(0,240,length.out = N))
# here, a list with dataframes is built with the sequences
l_dfs =  lapply(which(dataframe$Type == 'F'), function(i, .data){
  transform(subset(.data[i:nrow(.data),], (time.h - time.h[1]) <= 24), 
            t0 = sprintf('t0=%4.2f', time.h[1]))
}, dataframe)

ggplot(data=do.call('rbind', l_dfs), aes(x=A, y=B, colour=Type)) + 
  geom_point() + geom_path(colour='black') + facet_wrap(~t0)

答案 1 :(得分:1)

首先我创建了样本数据。希望它与你的问题相似:

df = data.frame(id=rep(1:9), A=c(12,13,13,14,12,11,12,11,10),
     B=c(13,12,10,12,6,9,10,11,12),
    Type=c("F","R","F","R","W","F","R","F","R"),
    datetime=as.POSIXct(c("2015-01-01 01:00:00","2015-01-01 22:50:00",
                          "2015-01-02 08:30:00","2015-01-02 23:00:00",
                          "2015-01-03 14:10:00","2015-01-05 16:30:00",
                          "2015-01-05 23:00:00","2015-01-06 17:00:00",
                          "2015-01-07 23:00:00")),
    stringsAsFactors = F)

您的第一个问题是绘制数据,突出显示F点后的第一个24小时。我使用dplyr和ggplot来完成这项任务。

library(dplyr)
library(ggplot)

df %>%
    mutate(nf = cumsum(Type=="F")) %>%  # build F-to-F groups
    group_by(nf) %>%
    mutate(first24h = as.numeric((datetime-min(datetime)) < (24*3600))) %>% # find the first 24h of each F-group
    mutate(lbl=paste0(row_number(),"-",Type)) %>%
    ggplot(aes(x=A, y=B, label=lbl)) + 
        geom_path(aes(colour=first24h)) + scale_size(range = c(1, 2)) +
        geom_text()

enter image description here 这里的问题是,颜色仅在某些点发生变化。我不满意的一件事是路径部分使用不同的线条颜色。如果first24h是离散变量 geom_path绘制两个sepearate路径。这就是我将变量定义为数字的原因。也许有人可以改善这个?

关于插值的第二个问题可以通过zoo包轻松解决:

library(zoo)

full.time = seq(df$datetime[1], tail(df$datetime, 1), by=600)   # new timeline with point at every 10 min
d.zoo = zoo(df[,2:3], df$datetime)        # convert to zoo object
d.full = as.data.frame(na.approx(d.zoo, xout=full.time))  # interpolate; result is also a zoo object
d.full$datetime = as.POSIXct(rownames(d.full))

将这两个数据帧组合在一起,您就可以获得解决方案。每个F-F部分都在一个单独的图中绘制,只显示F点后不超过24小时的点。

df %>%
    select(Type, datetime) %>%
    right_join(d.full, by="datetime") %>%
    mutate(Type = ifelse(is.na(Type),"",Type)) %>%
    mutate(nf = cumsum(Type=="F")) %>%
    group_by(nf) %>%
    mutate(first24h = (datetime-min(datetime)) < (24*3600)) %>%
    filter(first24h == TRUE) %>%
    mutate(lbl=paste0(row_number(),"-",Type)) %>%
    filter(first24h == 1) %>%
    ggplot(aes(x=A, y=B, label=Type)) + 
        geom_path() + geom_text() + facet_wrap(~ nf)

enter image description here