首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ggplot2中为分组行定义行绘制顺序?

如何在ggplot2中为分组行定义行绘制顺序?
EN

Stack Overflow用户
提问于 2014-11-18 21:03:12
回答 2查看 3.6K关注 0票数 2

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

代码语言:javascript
运行
复制
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美学,也会发生这种情况:

代码语言:javascript
运行
复制
ggplot(data = df, aes(x = x, y = y, colour = flag,
group = group, order = flag)) + geom_line(size = 3)

如果我重命名组标签(例如,如果使用flag = true的示例是组11-15而不是6-10),我能够得到我想要的绘图顺序,但是我假设有更好的方法来做到这一点。有什么方法可以根据组名重写顺序吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-19 00:10:06

一种方法是在绘制线时对数据进行子集。首先要为假组绘制线,然后才是真正的组。

代码语言:javascript
运行
复制
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)

票数 4
EN

Stack Overflow用户

发布于 2019-06-06 07:45:32

让我想起一个有5年历史的问题,但可能对其他人有帮助.

正如OP所提到的,线条的z阶(以及ggplot2中许多其他geom的)是由group美学决定的。order美学在geom_line文档中没有提到,也不确定它是否存在。

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

代码语言:javascript
运行
复制
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()着色变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27003991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档