前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ggplot2:分类变量在y-axis和legend的顺序调整

ggplot2:分类变量在y-axis和legend的顺序调整

原创
作者头像
伍文智
修改2023-09-26 10:09:06
4100
修改2023-09-26 10:09:06
举报
代码语言:javascript
复制
library(tidyverse)
library(patchwork)
dt <- diamonds[1:1000, ]

众所周知,在ggplot2中,对于分类型变量,我们可以通过将其转换为factor类型,并通过设置其levels控制其在坐标轴的顺序。

代码语言:javascript
复制
p1 <- dt %>% 
  ggplot(aes(x = carat, y = cut, color = cut)) +
  geom_point() +
  labs(title = "修改levels前")
cut_levels <- c("Premium", "Good", "Very Good", "Fair", "Ideal")
p2 <- dt %>% 
  mutate(across(cut, ~ factor(.x, levels = cut_levels))) %>% 
  ggplot(aes(x = carat, y = cut, color = cut)) +
  geom_point() +
  labs(title = "修改levels后")
p1 + p2
Figure 1
Figure 1

但是这样会导致一个问题:因为在y-axis中,数值从小到大是从下向上排序的,在我的levels中,"Premium"排在前面(序号最小),所以它排在最下面。但如果我们想要让需要最小的排在最上面(从小到大对应从上往下),我们可以把levels的顺序反过来。

代码语言:javascript
复制
p3 <- dt %>% 
  mutate(across(cut, ~ factor(.x, levels = rev(cut_levels)))) %>% 
  ggplot(aes(x = carat, y = cut, color = cut)) +
  geom_point() +
  labs(title = "修改levels后+levels反序")
p2 + p3
Figure 2
Figure 2

将levels反序后,虽然确实如我们所愿,在y-axis中序号从小到大对应变量从上到下排列,但是同时产生了一个新的问题:在legend中变量的排列也反了过来。此时我们需要让legend的排列也同样反过来。

代码语言:javascript
复制
p4 <- dt %>% 
  mutate(across(cut, ~ factor(.x, levels = rev(cut_levels)))) %>% 
  ggplot(aes(x = carat, y = cut, color = cut)) +
  geom_point() +
  guides(color = guide_legend(reverse = T)) +
  labs(title = "修改levels后+levels反序+legend反序")
p3 + p4
Figure 3
Figure 3

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档