2017-10-17 5 views
1

Je suis suivant ensemble de données:R comment ggplot fréquence toutes les 2 heures dans dataframe

time   tta  
08:20:00  1 
21:30:00  5 
22:00:00  1 
22:30:00  1 
00:25:00  1 
17:00:00  5 

je voudrais tracer graphique à barres à l'aide ggplot de telle sorte que l'axe des x a tous les toutes les 2 heures (00:00 : 00,02: 00: 00: 00: 00 et ainsi de suite) et l'axe y a la fréquence d'un facteur tta (1 et 5).

x-axis should be 00-01,01-02,... so on

+1

Alors, quelle est votre question? Qu'avez-vous essayé? – user3640617

+0

Q: comment tracer la fréquence de tta en utilisant les données de temps pour chaque intervalle de deux heures –

Répondre

2

J'approchèrent cela en utilisant le paquet xts, mais trouve qu'il ne propose pas de plancher le temps. Par conséquent, je conclus lubridate pour être plus pratique ici, aussi parce que ggplot ne comprend pas xts objets tout de suite. Les deux packages vous aident à transformer les données de temps de plusieurs façons.

Utilisez xts::align.time ou lubridate::floor_date pour passer votre temps à l'heure/heure/heure suivante/précédente.

Dans les deux cas, vous regroupez les données avant de les transmettre à ggplot. Vous pouvez utiliser sum pour résumer tta, ou simplement utiliser length pour compter le nombre d'occurrences, mais dans ce dernier cas, vous pouvez également utiliser geom_histogram sur la série temporelle uniquement. Vous pouvez déplacer les barres avec précaution dans ggplot avec position_nudge pour représenter une période plutôt que de rester assis centré sur un point de temps. Vous devez spécifier scale_x_time(labels = ..., breaks = ...) dans l'intrigue.

données:

time <- c(
    "08:20:00", 
    "21:30:00", 
    "22:00:00", 
    "22:30:00", 
    "00:25:00", 
    "17:00:00" 
) 
time <- as.POSIXct(time, format = "%H:%M:%S") 
tta <- c(1, 5, 1, 1, 1, 5) 

En utilisant xts:

library(xts) 
myxts <- xts(tta, order.by = time) 
myxts_aligned <- align.time(myxts, n = 60*60*2) # shifts all times to the next full 
# 2 hours 
myxts_agg <- period.apply(myxts_aligned, 
          INDEX = endpoints(myxts, "hours", 2), 
          FUN = sum) # sums up every two hours 
require(ggplot2) 
ggplot(mapping = aes(x = index(myxts_agg), y = myxts_agg[, 1])) + 
    geom_bar(stat = "identity", 
      width = 60*60*2, # one bar to be 2 hours wide 
      position = position_nudge(x = -60*60), # shift one hour to the left 
      # so that the bar represents the actual period 
      colour = "black") + 
    scale_x_time(labels = function(x) strftime(x, "%H:%M"), 
       breaks = index(myxts_agg)) + # add more breaks manually if you like 
    scale_y_continuous() # to escape the warning of ggplot not knowing 
    # how to deal with xts object 

En utilisant lubridate:

require(lubridate) 
require(tidyverse) 
mydf <- data.frame(time = time, tta = tta) 
mydf_agg <- 
    mydf %>% 
    group_by(time = floor_date(time, "2 hours")) %>% 
    summarise(tta_sum = sum(tta), tta_freq = n()) 
ggplot(mydf_agg, aes(x = time, y = tta_sum)) + 
    geom_bar(stat = "identity", 
      width = 60*60*2, # one bar to be 2 hours wide 
      position = position_nudge(x = 60*60), # shift one hour to the *right* 
      # so that the bar represents the actual period 
      colour = "black") + 
    scale_x_time(labels = function(x) strftime(x, "%H:%M"), 
       breaks = mydf_agg$time) # add more breaks manually if you like 

Après tout, allmost même:

xts and lubridate two hour aggregation

0

utiliser la fonction floor_date de lubridate

library(tidyverse) 
library(lubridate) 

your_df %>% group_by(floor_date(time,"2 hours")) %>% count(tta) 

puis ggplot avec geom_col à partir de là

+0

Merci, mais j'obtiens erreur: Erreur dans mutate_impl (.data, points): aucune méthode applicable pour 'reclass_date' appliqué à un objet de class "c ('hms', 'difftime')" –

+0

Avec la façon dont vous avez la colonne 'time', lubridate ne peut pas faire' floor_date'. vos données s'étendent sur plusieurs jours? Sinon, vous pouvez simplement prendre les deux premiers chiffres de la colonne 'time' en utilisant une sous-chaîne – shuckle

+0

données de temps sur plusieurs années mais elle ne devrait jouer aucun rôle car je vais utiliser la variable temps seulement avec la variable facteur. Comment regrouper les données temporelles en deux heures (bin) –