使用facet_grid时如何修改ggplot的x轴标签?
问题解决:facet_grid下x轴标签无法正常重命名
问题描述
使用ggplot2绘图时,尝试用自定义标签mylabels重命名x轴刻度,但添加facet_grid(~ diet, scales = "free_x")后,所有分面的x轴仅显示第一个标签;移除分面函数时,标签能正常显示。
问题原因
使用facet_grid(~diet, scales="free_x")后,每个分面仅包含单个diet类别,scale_x_discrete(labels = mylabels)会为每个分面的唯一x轴刻度分配列表的第一个元素,导致所有分面显示相同标签。同时你设置了strip.text.x = element_blank()隐藏了分面标题,失去了原本可以区分每个分面的标识。
解决方案
方法1:自定义分面标题(推荐)
既然分面是按diet划分的,直接将自定义标签设置为分面标题,同时恢复分面标题的显示,隐藏冗余的x轴刻度:
mylabels <- c("MRA2x3","MRA2x4","MRB2x3","MRB2x4","whole milk") # 创建命名向量,将原diet水平映射到自定义标签 diet_labels <- setNames(mylabels, levels(as.factor(file$diet))) ggplot(file, aes(x=as.factor(diet),y=ADG, fill= as.factor(farm))) + geom_boxplot(width=1,alpha=0.5) + scale_fill_viridis(discrete = TRUE, alpha=0.6,guide = guide_legend(title = "Farm")) + labs(y="Average daily gain", x = "") + # 清空x轴标题,用分面标题标识类别 scale_y_continuous(breaks=seq(0, max(file$ADG), by=0.2)) + theme(text = element_text(size = 18), panel.grid.minor.x = element_blank(), panel.grid.major.x = element_blank(), plot.title = element_text(hjust = 0.5), axis.text.x = element_blank(), # 隐藏x轴冗余刻度文本 axis.ticks.x = element_blank()) + # 隐藏x轴冗余刻度线 facet_grid(~ diet, scales = "free_x", labeller = labeller(diet = diet_labels)) # 设置分面自定义标签
方法2:强制显示完整x轴标签(不推荐)
如果一定要保留x轴标签,需取消scales="free_x",让所有分面共享同一x轴,但每个分面会显示所有diet刻度,仅当前类别有箱线图:
mylabels <- c("MRA2x3","MRA2x4","MRB2x3","MRB2x4","whole milk") ggplot(file, aes(x=as.factor(diet),y=ADG, fill= as.factor(farm))) + geom_boxplot(width=1,alpha=0.5) + scale_fill_viridis(discrete = TRUE, alpha=0.6,guide = guide_legend(title = "Farm")) + labs(y="Average daily gain", x = "Diet") + scale_y_continuous(breaks=seq(0, max(file$ADG), by=0.2)) + scale_x_discrete(labels = mylabels) + theme(text = element_text(size = 18), panel.grid.minor.x = element_blank(), panel.grid.major.x = element_blank(), plot.title = element_text(hjust = 0.5), strip.text.x = element_blank()) + facet_grid(~ diet) # 移除scales="free_x"参数
这种方式会导致每个分面显示所有x轴刻度,视觉冗余,因此更推荐方法1。
内容的提问来源于stack exchange,提问作者Falco
相关产品推荐
相关产品推荐

