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

2023-09-26 10:09:06 浏览数 (2)

代码语言: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 1Figure 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 2Figure 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 3Figure 3

0 人点赞