Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que meu gráfico de área empilhada em ggplot2 está vazio


Vou começar com a segunda pergunta, que é mais fácil. Usando o dplyr pacote, você pode usar top_n para obter as n maiores linhas de uma determinada coluna. Por exemplo:
> 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

Observe que você obterá mais de n linhas se houver empates para o enésimo lugar. Assim top_n(p_ash_r_100, 10, SMPL_CNT) retornará todo o conjunto de dados de amostra devido ao empate de 17 vias para o 4º.

Quanto à primeira pergunta, a documentação para geom_area dá uma pista:

Isso sugere que geom_area espera que a coluna mapeada para x seja numérica. Com base na listagem de p_ash_r_100 , SMPL_TIME parece ser um vetor de caracteres. Com o lubridate pacote, podemos converter SMPL_TIME para uma data e hora com dmy_hm :
p_ash_r_100a <- p_ash_r_100 %>%
  mutate_at(vars(SMPL_TIME), dmy_hm)

No entanto, isso não é suficiente para obter o gráfico desejado, pois existem vários valores de y para cada combinação de x e fill (que é a estética correta para geom_area , não "col "). Precisamos resumir os dados antes de plotar:
p_ash_r_100a %>%
  group_by(SMPL_TIME, EVENT) %>%
  summarise(total = sum(SMPL_CNT)) %>%
  ggplot(aes(SMPL_TIME, total, fill = EVENT)) +
  geom_area()



No entanto, o enredo ainda não está correto. Isso ocorre porque cada combinação de SMPL_TIME e EVENT não é representado no conjunto de dados. Precisamos informar explicitamente geom_area que y é igual a zero para as linhas ausentes. Uma maneira é usar o prático fill argumento em 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()