如何在ggplot2中为分组线定义线绘图顺序?

时间:2014-11-18 21:03:13

标签: r ggplot2

我的数据框类似于以下内容:

set.seed(1)
df = data.frame(group = sort(rep(1:15,5)), x = rep(1:5,15), 
y = c(runif(25,-1,1), runif(25, -.5,.5),runif(25,-1,1)),
flag = c(rep('false', 25), rep('true',25),rep('false', 25)))

其中x和y是绘图的坐标,group是不同行的标识符,flag是布尔值,表示行组的特殊子集。我想使用ggplot来绘制这些线条,以便flag = 'true'的线条显示在顶部。但是,绘图顺序似乎仅由组名确定。在我的示例df中,由于flag = 'true'的值对应于组6-10,因此它们被绘制在组1-5之上但在组11-15之下。即使我尝试以下列方式使用order美学,也会发生这种情况:

ggplot(data = df, aes(x = x, y = y, colour = flag,
group = group, order = flag)) + geom_line(size = 3)

如果我重命名组标签,我可以获得我想要的绘图顺序(例如,如果flag = true的示例是11-15组而不是6-10)但我认为有更好的这样做的方式。有没有办法按组名覆盖排序?

2 个答案:

答案 0 :(得分:2)

一种方法是在绘制线条时对数据进行子集化。您想首先为假组绘制线条,然后是真实组。

ggplot(data = df, aes(x = x, y = y, colour = flag,
       group = group)) +
geom_line(data = subset(df, flag == "false"), size = 3) +
geom_line(data = subset(df, flag == "true"), size = 3)

enter image description here

答案 1 :(得分:0)

重温5岁的问题,但可能对其他人有帮助...

如OP所述,线的z顺序(以及ggplot2中许多其他几何的z顺序)是由group美学决定的。 order的文档中没有提到geom_line的美感,不确定是否存在。

默认情况下,组按数字排序(如果是字符串,则按字母顺序排序),但是如果它们是因素,则将按级别对其进行排序。因此,诀窍是使它们成为具有特定级别顺序的因子,以确保第一级(底部z顺序)对应于标志false。可以使用forcats::fct_reorder()

library(tidyverse)
df %>% 
  mutate(group = forcats::fct_reorder(as_factor(group), flag, .fun=first)) %>% 
  ggplot(aes(x = x, y = y, colour = flag, group = group)) + 
  geom_line(size = 3)

此解决方案也适用于多种颜色的箱子。您可能需要先factor()将着色变量按正确的级别顺序排列(从下到上)