R ggplot2双geom_bar柱状图如何自定义x轴顺序并解决aes报错
问题原因
当使用%>%管道符将预处理后的数据传入ggplot时,不需要再在ggplot()的第一个参数位置重复指定数据集Growth4,否则会打乱ggplot的参数接收逻辑,导致系统无法正确识别aes映射,报出Mapping should be created with aes() or aes_()的错误。
之前单个geom_bar时未报错属于参数偶然匹配的巧合,多图层时映射校验更严格就会触发报错。
解决方法
删除ggplot()中重复的Growth4参数即可,修改后完整代码如下:
Growth4 %>% arrange(Label) %>% mutate(Label = factor(Label, levels=c( "Control", "B1 <2mm 5%", "B1 <2mm 10%", "B1 <2mm 20%", "B1 >2mm 5%", "B1 >2mm 10%", "B1 >2mm 20%", "B2 <2mm 5%", "B2 <2mm 10%","B2 <2mm 20%", "B2 >2mm 5%", "B2 >2mm 10%", "B2 >2mm 20%", "B3 <2mm 5%", "B3 <2mm 10%", "B3 <2mm 20%", "B3 >2mm 5%", "B3 >2mm 10% ", "B3 >2mm 20%"))) %>% ggplot(aes(x=Label))+ # 此处删除了重复传入的Growth4参数 geom_bar(aes(y=Shoot.dry.weight ), color="black", fill = "grey42", stat="identity")+ geom_errorbar(aes(ymin=Shoot.dry.weight-s.e.shoot, ymax=Shoot.dry.weight+s.e.shoot), width=.2, position=position_dodge(.9)) + geom_bar(aes(y=-Root.Dry.weight),color="black", fill = "grey60", stat="identity")+ geom_errorbar(aes(ymin=-Root.Dry.weight-s.e.root, ymax=-Root.Dry.weight+s.e.root), width=.2, position=position_dodge(.9)) + theme(axis.text.x=element_text(angle=90, size=12, color="black"),panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(),axis.line = element_line(colour = "black"),axis.text.y=element_text( size=14, color="black"),axis.title=element_text(size=14, face="bold"))+ ylab("Root dry weight(g) Shoot dry weight(g)")+ xlab("Treatment")+ ylim(-3,6)
额外注意事项
- 定义Label因子level时,
B3 >2mm 10%末尾多了一个空格,需要确保和原始数据Growth4里的对应Label文本完全一致,否则该类别会被转为缺失值不显示。 - 已经在ggplot全局映射里指定了
x=Label,后续geom层不需要重复写该参数,代码可以更简洁。
内容的提问来源于stack exchange,提问作者Charlotte Tutton
相关产品推荐
相关产品推荐

