我有一个类似于以下内容的数据格式:
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是绘图的坐标,组是不同行的标识符,标志是表示线条组的一个特殊子集的布尔值。我想用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),我能够得到我想要的绘图顺序,但是我假设有更好的方法来做到这一点。有什么方法可以根据组名重写顺序吗?
发布于 2014-11-19 00:10:06
一种方法是在绘制线时对数据进行子集。首先要为假组绘制线,然后才是真正的组。
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)
发布于 2019-06-06 07:45:32
让我想起一个有5年历史的问题,但可能对其他人有帮助.
正如OP所提到的,线条的z阶(以及ggplot2中许多其他geom的)是由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()
着色变量。
https://stackoverflow.com/questions/27003991
复制相似问题