为什么ggplot2中的堆积区域图为空

时间:2017-04-11 22:23:57

标签: r ggplot2 oracle11g

我正在尝试使用以下命令在r中生成堆积区域图:

ggplot(p_ash_r_100,aes(x=SMPL_TIME,y=SMPL_CNT,col=EVENT,group=1))+ geom_area()

这里EVENT是我想根据ORACLE DB中的时间和样本计数绘制出来的第3个变量。

但是带有上述命令的图表返回空白。

我的问题是:

  1. 如何解决空图问题。

  2. 如何根据显示时或之前的数据量仅过滤10个顶级变量?我可以在excel中轻松完成,就像我在图像文件中显示的那样。

  3. 我的数据集如下所示:

    > p_ash_r_100
              SMPL_TIME        SQL_ID                        MODULE                        EVENT SMPL_CNT
    1   11-APR-17 09:00 03d5x9busf1d8                      SQL*Plus                          CPU        1
    2   11-APR-17 09:00 2pb7bzzadj0pn OGG-RCASI004-OPEN_DATA_SOURCE      db file sequential read        1
    3   11-APR-17 09:00        NO_SQL                    GoldenGate                          CPU        1
    4   11-APR-17 09:00        NO_SQL                    MMON_SLAVE                          CPU        1
    5   11-APR-17 09:00        NO_SQL                        NO_SQL              Log archive I/O        1
    6   11-APR-17 09:00        NO_SQL                       XStream                          CPU        1
    7   11-APR-17 09:00 acuzxh557cq81                    GoldenGate      db file sequential read        1
    8   11-APR-17 09:00 cqtby4bsrmxzh                    GoldenGate                          CPU        1
    9   11-APR-17 09:00 dgzp3at57cagd                    GoldenGate      db file sequential read        2
    10  11-APR-17 09:00 fjp9t92a5yx1v                    GoldenGate      db file sequential read        1
    11  11-APR-17 09:00 guh1sva39p9db                    GoldenGate      db file sequential read        1
    12  11-APR-17 09:01 0hz0dhgwk12cd                    GoldenGate            direct path write        1
    13  11-APR-17 09:01 2jafq5d4n0akv                    GoldenGate                          CPU        1
    14  11-APR-17 09:01 37cspa0acgqxp                    GoldenGate      db file sequential read        2
    15  11-APR-17 09:01 79rugrngrvpt1 OGG-RADDR025-OPEN_DATA_SOURCE      db file sequential read        1
    16  11-APR-17 09:01 7k6zp92kbv28m                    GoldenGate                          CPU        1
    17  11-APR-17 09:01 7nvtkfc0bt8vv                    GoldenGate      db file sequential read        1
    18  11-APR-17 09:01 7pvpzvd1g769d                    GoldenGate                          CPU        1
    19  11-APR-17 09:01 9gduk46rmt5jy                    GoldenGate      db file sequential read        1
    20  11-APR-17 09:01        NO_SQL                    GoldenGate                          CPU 
    
       7
    

    为了便于理解,添加以下数据集的图像

    Adding image of the dataset here for ease of understanding

    我想从excel =>

    得到类似这样的结束图

    The end graph which i want to get it something like this one from excel

    在Excel中过滤值以获取excel中的前10个事件=>

    Value filters in excel to get Top 10 events  in excel

1 个答案:

答案 0 :(得分:1)

我将从第二个问题开始,这更容易。使用dplyr包,您可以使用top_n获取给定列的n个最大行。例如:

> 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

请注意,如果第n个地方有联系,您将获得超过n行。因此,top_n(p_ash_r_100, 10, SMPL_CNT)将返回整个样本数据集,因为第4版为17路。

至于第一个问题,geom_area的文档提供了一个线索:

  

区域图是堆积条形图的连续模拟(参见   geom_bar),可用于显示整体的组成如何变化   在x的范围内。

这表明geom_area期望映射到x的列应该是数字。根据{{​​1}}的列表,p_ash_r_100似乎是一个字符向量。使用SMPL_TIME包,我们可以将lubridate转换为SMPL_TIME的日期时间:

dmy_hm

然而,这还不足以获得您想要的情节,因为p_ash_r_100a <- p_ash_r_100 %>% mutate_at(vars(SMPL_TIME), dmy_hm) y的每个组合都有x的多个值(这是{的正确美学{1}},而非“fill”)。我们需要在绘图前总结数据:

geom_area

first stacked area plot

然而情节仍然不正确。这是因为colp_ash_r_100a %>% group_by(SMPL_TIME, EVENT) %>% summarise(total = sum(SMPL_CNT)) %>% ggplot(aes(SMPL_TIME, total, fill = EVENT)) + geom_area() 的每个组合都未在数据集中表示。我们需要明确告诉SMPL_TIME EVENT对于那些丢失的行,它们等于零。一种方法是在geom_area中使用方便的y参数。

fill

enter image description here