【问题标题】:Plotting data with Multiple Conditions on a Single Chart在单个图表上绘制具有多个条件的数据
【发布时间】:2014-11-03 06:51:01
【问题描述】:

我正在尝试使用 ggplot2 绘制一个绘图,并带有从某些条件生成的并排条,这些条件可以从数据中计算出来。我怀疑问题是正确格式化我的数据,以便 ggplot 给我我想要的。不过,我这辈子都做不好。

我所拥有的是数据框,其中填充了学生每次在学校学习课程时的行。感兴趣的变量是 Student.ID、Course.ID、Session、Fiscal.Year 和 Facility。每一行都是学生上一门课程的情况,并告诉他们上了什么课程,他们在哪里上过等等。据我所知,这是长格式数据所需要的(如果我是,请纠正我错误的)。唯一可能具有 NA 值的字段是 Facility,但我还是打算从图中排除这些字段,以便您可以将数据框视为已完全填充。

我想做的是按财政年度制作一个图表,显示有多少课程有 (注意:当我谈论提供了多少课程时,我考虑到每门课程可能会提供多次,并且每次提供它都有一个与之关联的会话编号。棘手的部分是会话编号不是唯一的。我希望这是有道理的,如果需要,我可以尝试澄清更多。)

我设想最终产品是在位置上使用分面的多个图表,x 轴是 Fiscal.Year,y 轴是课程/课程的数量。对于图表中的每个 FY,我希望并排堆叠不同的颜色条,显示该位置为该 FY 提供的总课程数

这里有一些可以使用的示例数据(键入为 CSV,因为我不能只复制文件的头部)。我已经排除了 Facility 列,因为通过它进行分面很容易,我们可以假设一个 FY 作为我认为的测试示例。作为参考,应该有 3 门

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

我试过了:

  • 使用 ddply 创建一个新的数据框,其中包含 Course.ID、Session、FY、Facility、Count of Students 列。然后我创建了一个名为“TwoLess”的新列,如果计数

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

我认为这种方法存在严重缺陷,我错过了长格式数据的一些“好处”,因为据我了解,这正是 ggplot 想要的。

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

还值得一提的是,虽然我可以访问一些更流行的包,如 ggplot2、plyr、reshape2,但我无法加载所有包,所以我更喜欢使用上述包(或任何它们的依赖项)。我不认为它应该有那么大的限制。

【问题讨论】:

  • 你能提供一些真实的数据或者更接近的数据吗?

标签: r ggplot2


【解决方案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 绘制它

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

【讨论】:

  • summarise(n=length(ID)) 可以是summarise(n = n())
  • @jazzurro 真的!但对我来说,这个成语并不是最有教育意义的。
  • 这看起来很像我想要的!当我返回时,我将不得不在工作中对其进行测试,但我没想过使用 plyr 两次然后将结果融合回数据框中。另外,%>% 应该是 %.% 吗?如果没有,%>% 到底是做什么的?无论哪种方式,这都解决了我过去一周无法解决的问题,所以谢谢!一切检查完毕后,我会对其进行测试并接受。
  • @KyleSykes 是的,%>% 应该是 %.%。相同的行为。 dplyr 的习语接受使用 %>% 之类的管道。
  • @KyleSykes 你有没有搞定最终的情节?
猜你喜欢
  • 2016-12-05
  • 2016-10-21
  • 2017-09-06
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多