如何在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的因子水平顺序决定,和数据框行序无关。默认按因子的字母/数值顺序排列,所以需要手动指定水平优先级。 - 修改步骤:
- 先将
time_hr转换为因子,把需要显示在上方的0hr放在因子水平的第一位 - 后续绘图代码保持不变即可
- 先将
修改后的完整代码:
# 调整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
相关产品推荐
相关产品推荐

