如何在ggplot2中调整分组柱形的填充分组顺序,指定组移至首位?
解决ggplot2分组柱形图调整分组顺序的问题
核心解决方案
要将UnDisturbed分组移到每个Sleep State下的首位,同时保留其他分组原有顺序,关键是把emean_Treatment转换为指定水平顺序的因子——ggplot对分类分组的排列是由因子水平(levels)决定的,而非数据集的行顺序。
具体操作步骤
- 确定目标分组顺序:
UnDisturbed→Disturbed_Feed→Disturbed_Foot→Disturbed_Temp→Recovery - 在数据集构建完成后,添加以下代码设置因子水平:
emeanframe$emean_Treatment <- factor(emeanframe$emean_Treatment, levels = c("UnDisturbed", "Disturbed_Feed", "Disturbed_Foot", "Disturbed_Temp", "Recovery"))
- 保持原绘图代码不变,直接运行即可得到正确顺序的柱形图。
为什么之前的方法无效?
- 调整数据集行顺序没用:ggplot默认按分类变量的**因子水平默认顺序(字母序)**排列分组,和数据框行顺序无关。
- 误用
scale_x_manual:你的x轴是emean_Sleep_State,分组是由fill=emean_Treatment控制的,因此需要调整fill对应的因子水平,而非x轴的刻度设置。
完整修正后的代码示例
数据集构建(含因子设置)
# 原始变量定义 emean_Sleep_State<-c('WAKE','SWS','REM','WAKE','SWS','REM','WAKE','SWS','REM','WAKE','SWS','REM','WAKE','SWS','REM') emean_Treatment<-c('Disturbed_Feed','Disturbed_Feed','Disturbed_Feed','Disturbed_Foot','Disturbed_Foot','Disturbed_Foot','Disturbed_Temp','Disturbed_Temp','Disturbed_Temp','Recovery','Recovery','Recovery','UnDisturbed','UnDisturbed','UnDisturbed') emean_Means<-c(27.68,52.64,21.36,35.38,47.96,15.59,42.28,45.84,6.03,27.56,52.2,22.36,28.62,52.84,21.01) emean_SE<-c(3.94,2.99,3.08,3.97,3.01,3.1,3.84,2.91,3.03,2.94,2.34,2.51,5.75,2.92,4.18) # 创建数据框(修正原代码中先计算上下限再创建数据框的错误) emeanframe<-data.frame(emean_Sleep_State,emean_Treatment,emean_Means,emean_SE) emeanframe$Estimated_Max_Means_emean <- emeanframe$emean_Means + emeanframe$emean_SE emeanframe$Estimated_Min_Means_emean <- emeanframe$emean_Means - emeanframe$emean_SE # 转换函数 backtransANG<-function(ANG_value){ real_value<-(sin(ANG_value/(180/pi)))^2 return(real_value) } # 计算真实值 realvalueemean<-apply(emeanframe[,c(3,5,6)],2,FUN=backtransANG) emeanframe$realmean<-realvalueemean[,1] emeanframe$realmaxmean<-realvalueemean[,2] emeanframe$realminmean<-realvalueemean[,3] # 关键:设置分组的因子水平顺序 emeanframe$emean_Treatment <- factor(emeanframe$emean_Treatment, levels = c("UnDisturbed", "Disturbed_Feed", "Disturbed_Foot", "Disturbed_Temp", "Recovery"))
绘图代码(无需修改)
emeanplot2<-ggplot(emeanframe, aes(x=emean_Sleep_State, y=realmean, fill=emean_Treatment))+ geom_col(position='dodge', color='black')+ geom_errorbar(aes(ymin=realminmean, ymax=realmaxmean), color='black',width=0.2,position=position_dodge(width=0.9),linewidth=1)+ scale_x_discrete(limits=c('WAKE','SWS','REM'))+ labs(x='Sleep State', y= 'Proportion of Behaviour', color="Type of Night",size=14)+ ylim(0,1)+ guides(fill=guide_legend(title='Type of Night'))+ theme(axis.text.x=element_text(size=12), axis.text.y=element_text(size=12), axis.title.x=element_text(size=14), axis.title.y=element_text(size=14))+ scale_fill_manual(values=c('pink','#F8766D','red','#00BA38','#619CFF')) # 显示图形 print(emeanplot2)
内容的提问来源于stack exchange,提问作者e_putyora
相关产品推荐
相关产品推荐

