R 如何在ggplot2中为分组线定义线打印顺序?

R 如何在ggplot2中为分组线定义线打印顺序?,r,ggplot2,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是一个布尔值,指示

我有一个类似于以下内容的数据帧:

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的下方。即使我尝试以以下方式使用订单美学,也会发生这种情况:

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

如果我重命名组标签,我可以得到我想要的打印顺序,例如,如果flag=true的示例是组11-15而不是组6-10,但我认为有更好的方法可以做到这一点。是否有某种方法可以覆盖按组名排序?

一种方法是在绘制线时将数据子集化。首先要为假组绘制线,然后为真组绘制线

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)

重新提出一个5年前的问题,但可能对其他人有帮助

如OP所述,ggplot2中线条和许多其他几何图形的z顺序由组美学决定。geom_line的文档中没有提到订单美学,不确定它是否存在

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

此解决方案也适用于多种颜色的情况。您可能需要首先将着色变量按从底层到顶层的适当顺序因子化

尝试查看geom_路径
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)