代码语言: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
但是这样会导致一个问题:因为在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
将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