ggplot2如何设置Y轴分类自上而下降序排列
问题根源
ggplot2 处理离散坐标轴时,轴上类别的排序完全由对应变量的因子水平(levels)决定,和数据框本身的行顺序无关。你用arrange()只是调整了数据框的行排列,没有改变变量的因子水平,自然不会影响轴顺序。
默认情况下,字符型变量传入ggplot会被自动转换为因子,水平按字符串字典序升序排列;搭配coord_flip()翻转坐标后,因子的第一个水平会显示在Y轴最底端,最后一个水平显示在Y轴最顶端,因此会出现taxa为A的分类显示在最下方的效果。
实现方案
你可以选任意一种方式实现A类在Y轴最顶端、按taxa字母顺序自上而下排列的效果:
方案1:绘图时直接反转离散轴顺序(代码最简洁)
不需要修改原始数据结构,只需要在绘图代码中添加一行标度设置,直接反转轴顺序即可:
plot_species_zones <- ggplot(data = ggplot_df, aes(fill = country, x = taxa_species_ordered)) + geom_point(aes(y=var1), size = 3, shape = 21)+ # 新增这一行,直接反转离散X轴(翻转后对应Y轴)的排序 scale_x_discrete(limits = rev) + theme_bw() + guides(fill=FALSE, color=FALSE)+ coord_flip() show(plot_species_zones)
方案2:提前设置因子水平(适合需要自定义复杂排序的场景)
如果你后续需要自定义调整类别的先后顺序,可以提前把taxa_species_ordered转为因子,手动指定水平顺序:
# 先按你需要的展示优先级排序数据 ggplot_df <- tb %>% arrange(taxa, scientific_name, country) # 生成标签后转为因子,设置水平顺序:注意翻转坐标后Y轴从下到上对应水平从前到后,因此要把你想放在最顶端的A类标签放到水平向量的末尾 ggplot_df$taxa_species_ordered <- factor( paste(ggplot_df$taxa," - ",ggplot_df$scientific_name), levels = rev(unique(paste(ggplot_df$taxa," - ",ggplot_df$scientific_name))) ) # 后续绘图代码和你原来的一致即可 plot_species_zones <- ggplot(data = ggplot_df, aes(fill = country, x = taxa_species_ordered)) + geom_point(aes(y=var1), size = 3, shape = 21)+ theme_bw() + guides(fill=FALSE, color=FALSE)+ coord_flip() show(plot_species_zones)
内容的提问来源于stack exchange,提问作者Strobila
相关产品推荐
相关产品推荐

