ggplot2按均值排序分组散点图时reorder函数失效问题求助
问题原因
排序未生效的核心原因是你仅在均值点的子图层内对Loc做了重排序,ggplot的全局坐标轴因子顺序由最外层ggplot()调用传入的x变量的因子水平决定,子图层内的x变量调整不会修改全局坐标轴顺序,反而会导致两个图层的x轴因子水平不匹配。
解决方案
有两种简便的修改方式,任选其一即可:
方式1:提前统一重排Loc因子水平
先提前计算分组均值,再将原始数据和汇总数据的Loc因子水平统一按均值排序,避免图层间顺序不一致:
library(tidyverse) library(ggpubr) # 生成分组汇总数据,同时按均值重排Loc的因子顺序 data_summary <- data %>% group_by(Loc) %>% summarise(Size.Mean = mean(Size)) %>% mutate(Loc = reorder(Loc, Size.Mean)) # 同步原始数据的Loc因子水平 data$Loc <- factor(data$Loc, levels = levels(data_summary$Loc)) # 绘图 ggplot(data,aes(Loc,Size,color=Loc)) + geom_point() + geom_point(data = data_summary, aes(y = Size.Mean), color = "black", shape = '-', size = 5) + theme_pubr(base_size=8) + scale_y_continuous(trans="log10") + theme(axis.text.x = element_text(angle = 90,hjust = 1), legend.position = "none")
方式2:直接在外层重排序+用stat_summary简化代码
不需要手动做分组汇总,直接在主绘图函数的x映射内做重排序,同时用stat_summary自动计算均值画横线,代码更简洁:
library(tidyverse) library(ggpubr) ggplot(data,aes(reorder(Loc, Size, mean),Size,color=Loc)) + geom_point() + # 直接按组计算均值画横线,size参数可调整横线长度 stat_summary(fun = mean, geom = "point", shape = "-", color = "black", size = 5) + theme_pubr(base_size=8) + scale_y_continuous(trans="log10") + labs(x = "Loc") + # 修正x轴显示名称 theme(axis.text.x = element_text(angle = 90,hjust = 1), legend.position = "none")
如果需要x轴按均值从大到小倒序排列,把reorder(Loc, Size, mean)改成reorder(Loc, Size, function(x)-mean(x))即可。
内容的提问来源于stack exchange,提问作者user2300940
相关产品推荐
相关产品推荐

