如何消除ggplot中的NA刻度并取消无数据月份的误差线绘制?
解决方案
问题1:移除3月的误差线
geom_errorbar默认会遍历数据中所有行,包括3月的无数据行。只需在geom_errorbar中通过data参数筛选掉3月的数据,就能只给有数据的月份绘制误差线:
geom_errorbar(data = subset(stn1, Month != "MAR"), aes(ymin=Temperature-Temperature_sd, ymax=Temperature+Temperature_sd), width=.2, position=position_dodge(.9))
问题2:修复X轴第二个9月的NA刻度
你设置的factor level里的"SEPTEMBER"在数据集中没有对应的匹配值,或者数据中次年9月的Month字段值不是这个字符串,导致ggplot无法生成有效刻度标签。提供两种解决方式:
方式一:统一两年9月的标签
如果不需要区分两年的9月,先给数据中的次年9月标记一个临时标识,再通过scale_x_discrete设置统一的刻度标签:
# 预处理数据:给重复的SEP(次年9月)加临时后缀 stn1$Month <- ifelse(stn1$Month == "SEP" & duplicated(stn1$Month), "SEP_next", stn1$Month) # 绘图时指定factor层级和刻度标签 bay <- ggplot(stn1, aes(x = factor(Month, level = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP_next")), y = Temperature))+ geom_bar(stat = "identity", position = position_dodge())+ theme_classic()+ xlab("Month")+ ylab("Temperature°C")+ geom_errorbar(data = subset(stn1, Month != "MAR"), aes(ymin=Temperature-Temperature_sd, ymax=Temperature+Temperature_sd), width=.2, position=position_dodge(.9))+ scale_x_discrete(labels = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP"))
方式二:区分两年9月的标签
如果需要明确区分两年的9月,直接通过scale_x_discrete给对应的层级设置自定义标签:
bay <- ggplot(stn1, aes(x = factor(Month, level = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEPTEMBER")), y = Temperature))+ geom_bar(stat = "identity", position = position_dodge())+ theme_classic()+ xlab("Month")+ ylab("Temperature°C")+ geom_errorbar(data = subset(stn1, Month != "MAR"), aes(ymin=Temperature-Temperature_sd, ymax=Temperature+Temperature_sd), width=.2, position=position_dodge(.9))+ scale_x_discrete(labels = c("SEP (Yr 1)", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP (Yr 2)"))
完整可运行代码(以方式一为例)
# 预处理数据 stn1$Month <- ifelse(stn1$Month == "SEP" & duplicated(stn1$Month), "SEP_next", stn1$Month) # 绘制图表 bay <- ggplot(stn1, aes(x = factor(Month, level = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP_next")), y = Temperature))+ geom_bar(stat = "identity", position = position_dodge())+ theme_classic()+ xlab("Month")+ ylab("Temperature°C")+ geom_errorbar(data = subset(stn1, Month != "MAR"), aes(ymin=Temperature-Temperature_sd, ymax=Temperature+Temperature_sd), width=.2, position=position_dodge(.9))+ scale_x_discrete(labels = c("SEP", "OCT", "NOV", "DEC", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP")) print(bay)
内容的提问来源于stack exchange,提问作者Bailey Lin
相关产品推荐
相关产品推荐

