如何在ggplot2中处理标准差大于均值时的误差棒与柱状图显示
问题与解决方案
问题描述
我有一套河口区域的盐度(Salinity)数据,其中某月份的标准差(SD)大于均值。该月份因大量淡水输入,海湾上部盐度极低(约0.2),其他区域仍维持在约18。我选取5个采样点,绘制所有点位月度平均盐度的柱状图,并使用标准差作为误差棒。但在SD大于均值的月份,误差棒会低于0,我希望将柱状图下限固定为0,使该月图表与其他月份一致。
原代码如下:
sal <- ggplot(baywide, aes(x = factor(Month, levels = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEPTEMBER", "OCTOBER","NOVEMBER", "DECEMBER", "JANUARY", "FEBRUARY", "MARCH", "APRIL","may", "JUNE", "JULY", "AUGUST")), y = Salinity))+ geom_bar(stat = "identity", color = "cornflowerblue", fill = "cornflowerblue", position = position_dodge())+ theme_classic()+ xlab("")+ ylab("Salinity (PSU)")+ scale_y_continuous(expand = expansion(mult = 0), limits = c(0, 35), breaks = c(0, 5, 10, 15, 20, 25, 30, 35))+ theme(axis.text.x = element_blank(), axis.ticks.x=element_blank())+ geom_errorbar(aes(ymin=Salinity-Salinity_sd, ymax=Salinity+Salinity_sd), width=.2, position=position_dodge(.9))+ scale_x_discrete(labels=c("SEP" = "SEP22", "OCT" = "OCT22", "NOV" = "NOV22", "DEC" = "DEC22", "JAN" = "JAN23","FEB" = "FEB23", "MAR" = "MAR23", "APR" = "APR23", "MAY" = "MAY23", "JUN" = "JUN23","JUL" = "JUL23", "AUG" = "AUG23", "SEPTEMBER" = "SEP23", "OCTOBER" = "OCT23", "NOVEMBER" = "NOV23", "DECEMBER" = "DEC23", "JANUARY" = "JAN24", "FEBRUARY" = "FEB24", "MARCH" = "MAR24", "APRIL" = "APR24", "may" = "MAY24", "JUNE" = "JUN24", "JULY" = "JUL24", "AUGUST" = "AUG24")) print(sal)
解决方案
只需修改geom_errorbar中的ymin参数,使用*pmax()*函数将误差棒的下限强制限制为0。该函数会取两个值中的较大者,当Salinity-Salinity_sd小于0时,自动返回0,避免误差棒超出坐标轴下限。
修改后的完整代码:
sal <- ggplot(baywide, aes(x = factor(Month, levels = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEPTEMBER", "OCTOBER","NOVEMBER", "DECEMBER", "JANUARY", "FEBRUARY", "MARCH", "APRIL","may", "JUNE", "JULY", "AUGUST")), y = Salinity))+ geom_bar(stat = "identity", color = "cornflowerblue", fill = "cornflowerblue", position = position_dodge())+ theme_classic()+ xlab("")+ ylab("Salinity (PSU)")+ scale_y_continuous(expand = expansion(mult = 0), limits = c(0, 35), breaks = c(0, 5, 10, 15, 20, 25, 30, 35))+ theme(axis.text.x = element_blank(), axis.ticks.x=element_blank())+ # 用pmax限制误差棒下限为0 geom_errorbar(aes(ymin=pmax(Salinity-Salinity_sd, 0), ymax=Salinity+Salinity_sd), width=.2, position=position_dodge(.9))+ scale_x_discrete(labels=c("SEP" = "SEP22", "OCT" = "OCT22", "NOV" = "NOV22", "DEC" = "DEC22", "JAN" = "JAN23","FEB" = "FEB23", "MAR" = "MAR23", "APR" = "APR23", "MAY" = "MAY23", "JUN" = "JUN23","JUL" = "JUL23", "AUG" = "AUG23", "SEPTEMBER" = "SEP23", "OCTOBER" = "OCT23", "NOVEMBER" = "NOV23", "DECEMBER" = "DEC23", "JANUARY" = "JAN24", "FEBRUARY" = "FEB24", "MARCH" = "MAR24", "APRIL" = "APR24", "may" = "MAY24", "JUNE" = "JUN24", "JULY" = "JUL24", "AUGUST" = "AUG24")) print(sal)
内容的提问来源于stack exchange,提问作者Bailey Lin
相关产品推荐
相关产品推荐

