Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum ist mein gestapeltes Flächendiagramm in ggplot2 leer

Ich beginne mit der zweiten Frage, die einfacher ist. Mit dplyr Paket, können Sie top_n verwenden um die n größten Zeilen für eine bestimmte Spalte zu erhalten. Zum Beispiel:

> 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

Beachten Sie, dass Sie mehr als n Zeilen erhalten, wenn es Gleichstände für den n-ten Platz gibt. Also top_n(p_ash_r_100, 10, SMPL_CNT) gibt aufgrund der 17-Wege-Gleichung für Platz 4 den gesamten Beispieldatensatz zurück.

Was die erste Frage betrifft, die Dokumentation für geom_area liefert einen Anhaltspunkt:

Dies legt nahe, dass geom_area erwartet, dass die x zugeordnete Spalte numerisch sein sollte. Basierend auf der Auflistung für p_ash_r_100 , SMPL_TIME scheint ein Zeichenvektor zu sein. Mit dem lubridate Paket können wir SMPL_TIME umwandeln zu einer Datumszeit mit dmy_hm :

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

Dies reicht jedoch nicht aus, um den gewünschten Plot zu erhalten, da es mehrere Werte von y gibt für jede Kombination von x und fill (das ist die korrekte Ästhetik für geom_area , nicht "col "). Wir müssen die Daten vor dem Plotten zusammenfassen:

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

Doch die Handlung stimmt noch immer nicht. Dies liegt daran, dass jede Kombination von SMPL_TIME und EVENT ist im Datensatz nicht vertreten. Wir müssen geom_area ausdrücklich mitteilen dass y für diese fehlenden Zeilen gleich Null ist. Eine Möglichkeit besteht darin, das praktische fill zu verwenden 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()