我的数据框类似于以下内容:
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)但我认为有更好的这样做的方式。有没有办法按组名覆盖排序?
答案 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)
答案 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()
将着色变量按正确的级别顺序排列(从下到上)