2015-07-24 5 views
8

я изначально имеющий набор данных, как показано ниже:Извлечение точки из ggplot и построить его

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... 

Я попытался сделать ggplot указанного выше набора данных для A и B.

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

Проблема:

  1. Как добавить переменную Подменю, которая смотрит на первые 24 часа после каждой точки F.

  2. В настоящее время я опубликовал непрерывный набор данных [по времени], но мой исходный набор данных не является непрерывным. Как я могу сделать свой набор данных непрерывным с интервалом в 10 минут? Я использовал интерполяции xspline() функцию A и B, но я не знаю, как сделать мои данные установить непрерывное по времени,

Выделенная часть, показанная ниже, что я ищу, я хотите извлечь этот набор данных, а затем построить новый ggplot:

с MarkusN участков это то, что я ищу:

Принимая пихты й пункт в пункте «F» и путешествия 24 часов с этого момента (не так как нет 24 часов набор данных можно найти здесь, так что следует производить, как это):

Image

+0

вы хотите Постройте против B, или вы хотите, чтобы построить A и B в зависимости от времени? – Sarina

+0

@SarinaJ. да. Я хочу добавить фактор времени в свой ggplot. Также я хочу решить указанную проблему. (Принимая «F» в качестве отправной точки и нарисуйте еще один ggplot в течение следующих 24 часов.) –

+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) 

Ваш первый вопрос должен построить данные, выделив первую 24h после F-точки. Для этой задачи я использовал 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 рисует два сепарируемых пути. Вот почему я определил переменную как числовую. Может быть, кто-то может это улучшить?

Ваш второй вопрос об интерполяции может быть легко решена с помощью пакета зоопарка:

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)) 

С помощью этих двух dataframes вместе взятых, вы получите решение. Каждая секция F-F нарисована на отдельном участке, и отображаются только точки, не превышающие 24 часа после отображения F-точки.

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

+0

Маркус благодарит вас за ответ. Однако из вашего набора данных есть 4 'F' точки, что означает, что должно быть 4 ggplots, каждый ggplot начинается от «F» до следующих 24 часов. Однако в этом случае вы отслеживали F-F. Я добавил сюжет в своем вопросе (из вашего ответа) для лучшего понимания. Можете ли вы мне помочь? –

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) 
+0

это не сработало для меня .. –

+0

Что не сработало для вас? Пример, который я дал с помощью симулированных данных? Или пример с вашими данными? Правильно ли вы изменили свою временную переменную? – marc1s

+0

Не знаю. Я не получил работу от проблемы ... !! Это исправлено? –

Смежные вопросы