sql >> Database >  >> RDS >> Oracle

Waarom is mijn gestapelde vlakgrafiek in ggplot2 leeg?

Ik begin met de tweede vraag, die is makkelijker. De dplyr . gebruiken pakket, kunt u top_n . gebruiken om de n grootste rijen voor een bepaalde kolom te krijgen. Bijvoorbeeld:

> 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

Merk op dat je meer dan n rijen krijgt als er gelijke punten zijn voor de nde plaats. Dus top_n(p_ash_r_100, 10, SMPL_CNT) zal de volledige set met voorbeeldgegevens retourneren vanwege de 17-voudige gelijkspel voor de 4e.

Wat betreft de eerste vraag, de documentatie voor geom_area geeft een aanwijzing:

Dit suggereert dat geom_area verwacht dat de kolom die is toegewezen aan x numeriek moet zijn. Gebaseerd op de vermelding voor p_ash_r_100 , SMPL_TIME lijkt een karaktervector te zijn. Met het lubridate pakket, kunnen we SMPL_TIME . converteren naar een datum-tijd met dmy_hm :

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

Dit is echter niet genoeg om de gewenste plot te krijgen, aangezien er meerdere waarden zijn van y voor elke combinatie van x en fill (wat de juiste esthetiek is voor geom_area , niet "col "). We moeten de gegevens samenvatten voordat we plotten:

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

Toch klopt het plot nog steeds niet. Dit komt omdat elke combinatie van SMPL_TIME en EVENT komt niet voor in de dataset. We moeten geom_area expliciet vertellen dat y is gelijk aan nul voor de ontbrekende rijen. Een manier is om de handige fill . te gebruiken argument 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()




  1. ifelse &grepl-opdrachten bij gebruik van dplyr voor SQL in-db-bewerkingen

  2. Forceer mysql om de beperking van een externe sleutel te omzeilen

  3. sorteer de rollup in groep op

  4. verschil tussen UNHEX en X (MySQL)