首页 文章

在单个图表上使用多个条件绘制数据

提问于
浏览
2

我试图使用ggplot2创建一个绘图,其中并排条形可以从某些条件生成,这些条件可以从数据中计算出来 . 我怀疑问题是正确格式化我的数据,以便ggplot会给我我想要的东西 . 我不能为我的生活做好准备 .

我所拥有的是每次学生在学校上课时填充行的数据框 . 感兴趣的变量是Student.ID,Course.ID,Session,Fiscal.Year和Facility . 每一行都是一名学生参加课程并说明他们选择了什么课程,他们在哪里学习,等等 . 据我所知,这是数据长篇大论所需要的(如果我是正确的话,请纠正我)错误) . 唯一具有可能NA值的字段是Facility,但我打算从图中排除那些,因此您可以将数据框视为完全填充 .

我想要做的是制作一个图表,显示按财政年度有多少课程<= 2名学生,有多少人有<4名学生,有多少人<= 4名学生,以及总共提供了多少课程 . (注意:当我考虑到每个课程可以多次提供时,每次提供它都有一个与之相关的会话编号 . 棘手的部分是会话编号不是唯一的 . 我希望这是有道理的,如果需要,我可以尝试澄清更多 . )

我设想最终产品是使用位置上的facet的多个图表,x轴是Fiscal.Year,y轴是课程/会话的数量 . 对于图表中的每个FY,我想要并排堆叠不同颜色的条形图,显示在该位置为该FY提供的<2,<4,<= 4,总数的总数 . 考虑下面的图表,而不是“收入,费用,贷款”,我想要“<= 2,<4,<= 4,总计”(它们也会从左到右递增,因为不同之间存在类别) .

Sample chart similar to what I'm looking for

下面是一些要使用的示例数据(键入为CSV,因为我不能只复制文件的头部) . 我已经排除了Facility专栏,因为这样做很简单,我认为我可以假设一个FY用于测试示例 . 作为参考,它应该有3门课程,<= 2名学生,5门课程<4,6门课程<= 4.该样本组提供的课程总数为6 .

ID,CourseID,Session,Fiscal.Year 101,1,,1,FY13 102,1,1,FY13 103,1,1,FY13 104,1,1,FY13 101,2,1,FY13 102,2,1,FY13 103,2,1,FY13 101,2,2,FY13 102,2,2,FY13 103,2,2,FY13 101,3,1,FY13 102,3,1,FY13 101,3,2,FY13 102,3,2,FY13 101,3,3,FY13 102,3,3,FY13

我试过了:

  • 使用带有列Course.ID,Session,FY,Facility,Count of Students的ddply创建新数据框 . 然后我使用了一个名为"TwoLess"的新列,如果计数<= 2则只有1,否则为0 . (我为其他条件重复了这个过程,同样为其他条件创建了新的列 . )使用下面的ggplot代码我只能得到一个条件的情节(即:只有<= 2个学生),但是无法让他们结合起来 . 我相信以下是使用的等效代码,更改为反映我上面的测试集:

ggplot(na.omit(df), aes(y = TwoLess, x = Fiscal.Year)) + geom_bar(stat = 'identity') + facet_wrap(~Facility)

我认为这种方法存在严重缺陷,我错过了以长形式提供数据的一些“好处”,因为这就是我理解的ggplot所需要的 .

在ggplot中绘制这个图的最佳方法是什么?

还值得一提的是,虽然我可以访问一些比较受欢迎的软件包,比如ggplot2,plyr,reshape2,但我没有能力加载所有软件包,所以我更喜欢使用上述软件包(或其任何依赖项)的解决方案) . 它不应该是那么大的限制,我不认为 .

1 回答

  • 1

    这样的事情有帮助吗?

    扩展您的数据

    > dput(df)
    structure(list(ID = c(101L, 102L, 103L, 104L, 101L, 102L, 103L, 
    101L, 102L, 103L, 101L, 102L, 101L, 102L, 101L, 102L, 101L, 102L, 
    103L, 104L, 101L, 102L, 103L, 101L, 102L, 103L, 101L, 102L, 101L, 
    102L, 101L, 102L, 101L, 102L, 103L, 104L, 101L, 102L, 103L, 101L, 
    102L, 103L, 101L, 102L, 101L, 102L, 101L, 102L), CourseID = c(1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), 
        Session = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
        2L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 
        1L, 2L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
        1L, 1L, 2L, 2L, 3L, 3L), Fiscal.Year = c("FY13", "FY13", 
        "FY13", "FY13", "FY13", "FY13", "FY13", "FY13", "FY13", "FY13", 
        "FY13", "FY13", "FY13", "FY13", "FY13", "FY13", "FY14", "FY14", 
        "FY14", "FY14", "FY14", "FY14", "FY14", "FY14", "FY14", "FY14", 
        "FY14", "FY14", "FY14", "FY14", "FY14", "FY14", "FY15", "FY15", 
        "FY15", "FY15", "FY15", "FY15", "FY15", "FY15", "FY15", "FY15", 
        "FY15", "FY15", "FY15", "FY15", "FY15", "FY15")), .Names = c("ID", 
    "CourseID", "Session", "Fiscal.Year"), class = "data.frame", row.names = c(NA, 
    -48L))
    
    df
        ID CourseID Session Fiscal.Year
    1  101        1       1        FY13
    2  102        1       1        FY13
    3  103        1       1        FY13
    4  104        1       1        FY13
    5  101        2       1        FY13
    6  102        2       1        FY13
    7  103        2       1        FY13
    8  101        2       2        FY13
    9  102        2       2        FY13
    10 103        2       2        FY13
    11 101        3       1        FY13
    12 102        3       1        FY13
    13 101        3       2        FY13
    14 102        3       2        FY13
    15 101        3       3        FY13
    16 102        3       3        FY13
    17 101        1       1        FY14
    18 102        1       1        FY14
    19 103        1       1        FY14
    20 104        1       1        FY14
    21 101        2       1        FY14
    22 102        2       1        FY14
    23 103        2       1        FY14
    24 101        2       2        FY14
    25 102        2       2        FY14
    26 103        2       2        FY14
    27 101        3       1        FY14
    28 102        3       1        FY14
    29 101        3       2        FY14
    30 102        3       2        FY14
    31 101        3       3        FY14
    32 102        3       3        FY14
    33 101        1       1        FY15
    34 102        1       1        FY15
    35 103        1       1        FY15
    36 104        1       1        FY15
    37 101        2       1        FY15
    38 102        2       1        FY15
    39 103        2       1        FY15
    40 101        2       2        FY15
    41 102        2       2        FY15
    42 103        2       2        FY15
    43 101        3       1        FY15
    44 102        3       1        FY15
    45 101        3       2        FY15
    46 102        3       2        FY15
    47 101        3       3        FY15
    48 102        3       3        FY15
    

    用dplyr总结一下

    d1 <- df %>%
      group_by(CourseID, Session, Fiscal.Year) %>%
      summarise(n=length(ID))
    

    然后再次

    d2 <- d1 %>%
      group_by(Fiscal.Year) %>%
      summarise(d1 = length(n[n <= 2]),
                d2 = length(n[n <  4]),
                d3 = length(n[n <= 4])
      )
    library(reshape2)
    d3 <- melt(d2)
    ggplot(d3, aes(Fiscal.Year, value, fill = variable)) +
      geom_bar(stat = 'identity', position = 'dodge')
    

    用ggplot2绘制它

    barplot

    有人必须提供一个聪明的选择 . 我累了 . 现在去睡觉 .

相关问题