You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot分组直方图中调整0hr与24hr图层的前后顺序

问题解决:调整ggplot叠加直方图的图层顺序

我用ggplot绘制按时间分组的叠加直方图,希望time 0hr的直方图显示在time 24hr的前方以提升可视性,但调整数据框的行序后没有效果。当前代码如下:

pHs <- ggplot(pH_yes, aes(x=pH,fill=time_hr,color=time_hr)) 
pHs <- pHs +  geom_histogram(bins=70,alpha=0.6,position ="identity")
pHs <- pHs + theme_bw()
pHs <- pHs + ggtitle(title2) + xlab("pH") + ylab("count")
pHs <- pHs + scale_y_continuous(breaks = seq(0,16,by=2),limits = c(0,16))
pHs <- pHs + scale_x_continuous(breaks = seq(3,7,by=0.2),limits = c(4.6,5.8))
pHs <- pHs + theme(plot.title = element_text(size = 12,hjust = 0.5))
pHs <- pHs + scale_fill_manual(values = c("pink1","aquamarine"))
pHs <- pHs + scale_color_manual(values = c("violet","skyblue"))
pHs 

解决方法

  • 核心原因:ggplot的图层堆叠顺序由time_hr的因子水平顺序决定,和数据框行序无关。默认按因子的字母/数值顺序排列,所以需要手动指定水平优先级。
  • 修改步骤:
    1. 先将time_hr转换为因子,把需要显示在上方的0hr放在因子水平的第一位
    2. 后续绘图代码保持不变即可

修改后的完整代码:

# 调整time_hr的因子水平,让0hr排在前面
pH_yes$time_hr <- factor(pH_yes$time_hr, levels = c("0hr", "24hr"))

pHs <- ggplot(pH_yes, aes(x=pH,fill=time_hr,color=time_hr)) 
pHs <- pHs +  geom_histogram(bins=70,alpha=0.6,position ="identity")
pHs <- pHs + theme_bw()
pHs <- pHs + ggtitle(title2) + xlab("pH") + ylab("count")
pHs <- pHs + scale_y_continuous(breaks = seq(0,16,by=2),limits = c(0,16))
pHs <- pHs + scale_x_continuous(breaks = seq(3,7,by=0.2),limits = c(4.6,5.8))
pHs <- pHs + theme(plot.title = element_text(size = 12,hjust = 0.5))
pHs <- pHs + scale_fill_manual(values = c("pink1","aquamarine"))
pHs <- pHs + scale_color_manual(values = c("violet","skyblue"))
pHs 

如果你的time_hr是数值型(比如存储为0和24),直接用数值指定因子水平即可:

pH_yes$time_hr <- factor(pH_yes$time_hr, levels = c(0, 24))

内容的提问来源于stack exchange,提问作者casella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:45:31