Oracle
 sql >> Database >  >> RDS >> Oracle

Perché il mio grafico ad area in pila in ggplot2 è vuoto

Inizierò con la seconda domanda, che è più semplice. Usando il dplyr pacchetto, puoi usare top_n per ottenere le n righe più grandi per una determinata colonna. Ad esempio:

> top_n(p_ash_r_100a, 3, SMPL_CNT) %>% arrange(desc(SMPL_CNT))
# A tibble: 3 × 5
            SMPL_TIME        SQL_ID     MODULE                   EVENT SMPL_CNT
               <dttm>         <chr>      <chr>                   <chr>    <int>
1 2017-04-11 09:01:00        NO_SQL GoldenGate                     CPU        7
2 2017-04-11 09:00:00 dgzp3at57cagd GoldenGate db file sequential read        2
3 2017-04-11 09:01:00 37cspa0acgqxp GoldenGate db file sequential read        2

Nota che otterrai più di n righe se ci sono pareggi per l'ennesima posizione. Quindi top_n(p_ash_r_100, 10, SMPL_CNT) restituirà l'intero set di dati di esempio a causa del pareggio a 17 vie per il 4° posto.

Per quanto riguarda la prima domanda, la documentazione per geom_area fornisce un indizio:

Ciò suggerisce che geom_area prevede che la colonna mappata su x dovrebbe essere numerica. Basato sull'elenco per p_ash_r_100 , SMPL_TIME sembra essere un vettore di caratteri. Con il lubridate pacchetto, possiamo convertire SMPL_TIME a una data e ora con dmy_hm :

p_ash_r_100a <- p_ash_r_100 %>%
  mutate_at(vars(SMPL_TIME), dmy_hm)

Tuttavia, questo non è sufficiente per ottenere la trama che desideri poiché ci sono più valori di y per ogni combinazione di x e fill (che è l'estetica corretta per geom_area , non "col "). Dobbiamo riassumere i dati prima di tracciare:

p_ash_r_100a %>%
  group_by(SMPL_TIME, EVENT) %>%
  summarise(total = sum(SMPL_CNT)) %>%
  ggplot(aes(SMPL_TIME, total, fill = EVENT)) +
  geom_area()

Eppure la trama non è ancora corretta. Questo perché ogni combinazione di SMPL_TIME e EVENT non è rappresentato nel set di dati. Dobbiamo dirlo esplicitamente a geom_area quel y è uguale a zero per le righe mancanti. Un modo è usare il pratico fill argomento in tidyr::spread .

group_by(p_ash_r_100a, SMPL_TIME, EVENT) %>%
  summarise(smpl_sum = sum(SMPL_CNT)) %>%
  spread(EVENT, smpl_sum, fill = 0) %>% 
  gather(EVENT, smpl_sum, CPU, `db file sequential read`, 
         `direct path write`,
         `Log archive I/O`) %>%
  ggplot(aes(x = SMPL_TIME, y = smpl_sum, fill = EVENT)) +
  geom_area()