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

时间:2014-09-09 18:42:33

标签: r ggplot2

我正在尝试使用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,Total" (它们也会从左到右递增,因为不同类别之间包含)。

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 个答案:

答案 0 :(得分: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

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