线图用ggplot2(facet)绘制子集数据

时间:2017-12-11 16:42:44

标签: r ggplot2 subset facet

我有测试成绩数据。我想在不同年份(3行)的阅读中获得3个不同考试成绩的ggline图。我想在相同的年份(4行)写下4个不同的考试成绩。在一个地块上拥有所有7个令人困惑的阅读。 我可以对数据进行子集化,使其显示读取或写入,但我似乎无法将它们整齐地叠加在一起。

年,身份证,考试,分数,类型

2010,1,R1,72.75,R
2010,1,R2,68.25,R
2010,1,R3,83.75,R
2010,1,W1,89.25,W
2010,1,W2,58.25,W
2010年,1,W3,64.25,W
2010,1,W4,90.25,W
2011年,1,R1,52.25,R
2011年,1,R2,90.25,R
2011,1,R3,73.25,R
2011年,1,W1,79.5,W
2011年,1,W2,89.25,W
2011年,1,W3,85.25,W
2011年,1,W4,78.25,W

...

我有这个代码来生成一个只读的图:

ggplot(subset(df,skill %in% c("R1", "R2", "R3"))) + 
  geom_line(aes(year, score, group=skill, colour=skill)) 

我试图这样做以获得两者,但显然是不正确的:

p1 <- subset(df,skill %in% c("R1", "R2", "R3"))
p2 <- subset(df,skill %in% c("W1", "W2", "W3", "W4"))
ggplot()+ geom_line(data=p1, aes(year, score, group=skill, colour=skill)) +
  geom_line(data=p2, aes(year, score, group=skill, colour=skill)) +
  facet_grid(~type)

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

如果您要根据类型进行构面,则无需将数据子集化为p1和p2。

ggplot(df) + 
  geom_line(aes(year, score, group = skill, colour = skill)) +
  facet_wrap(~type)

替代方案,添加nrow =2来叠加图和scales = "free"以给它们提供独立的轴。

ggplot(df) + 
  geom_line(aes(year, score, group = skill, colour = skill)) +
  facet_wrap(~type, nrow = 2, scales = "free")

但是,您的评论说

  

这确实有效,但它将图形并排放置而不是垂直堆叠。有没有办法将它们叠加在另一个上面并且可能将图例分开,因此读写是分开的?

要解决单独的图例,我会制作每个图,然后使用包cowplot进行组合。使用gridExtracowplot执行此操作的其他方法使这一点变得简单。

p1 <- ggplot(subset(df,skill %in% c("R1", "R2", "R3"))) + 
  geom_line(aes(year, score, group = skill, colour = skill)) +
  facet_wrap(~type, scales = "free")

p2 <- ggplot(subset(df,type %in% c("W"))) + 
  geom_line(aes(year, score, group = skill, colour = skill)) +
  facet_wrap(~type, scales = "free")

cowplot::plot_grid(p1, p2, nrow = 2)