如何消除R语言ggplot2分组柱状图与X轴之间的空白?
解决ggplot2分组柱状图与X轴之间的空白问题
嗨,我懂你现在的困扰——分组柱状图整体效果都满意,唯独X轴和柱子之间的空白看着别扭,想让坐标轴在0点完美对齐对吧?之前用scale_continuous出错是因为找错了针对离散X轴的调整方法,我来给你一步步搞定:
问题根源
你的X轴predator是离散型因子(factor),ggplot默认会给离散轴的两端添加少量空白来避免柱子贴边,而你需要的是完全移除这些空白,让X轴和Y轴在原点处相交。
解决方案
我们需要针对离散X轴调整扩展参数,同时确保Y轴从0开始(避免柱子悬空):
- 对X轴:用
scale_x_discrete(expand = c(0, 0)),expand的两个值分别控制轴两端的空白比例,设为c(0,0)就完全移除空白; - 对Y轴:用
scale_y_continuous(expand = c(0, 0), limits = c(0, NA)),既移除Y轴底部的空白,又保证Y轴从0开始,limits = c(0, NA)还会自动适配你的数据上限,不会截断柱子。
修改后的完整代码
library(ggplot2) # 读取数据 data <- read.table(text=" predator,juvenile,frequency uninfected,uninfected,20 uninfected,infected,10 infected,uninfected,16 infected,infected,14", header=TRUE, sep=",") # 设置因子顺序 data$predator <- factor(data$predator, levels=c("uninfected","infected")) # 绘制柱状图并调整轴空白 p <- ggplot(data, aes(x=predator, y=frequency, fill=juvenile)) + geom_bar(stat="identity", colour="black", position="dodge") + scale_fill_manual(values = c("#FFFFFF", "#000000")) + # 移除X轴两端空白 scale_x_discrete(expand = c(0, 0)) + # Y轴从0开始,移除底部空白 scale_y_continuous(expand = c(0, 0), limits = c(0, NA)) + # 主题调整 theme(legend.position = "none", panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black")) + labs(x="adult", y="frequency of choice") p
为什么之前用scale_continuous不行?
因为你的X轴是离散的因子类型,scale_continuous是用来调整连续型数值轴的,强行用在离散轴上会破坏轴的结构,导致Y轴线条消失这类问题,所以一定要对应轴的类型选择正确的scale函数~
内容的提问来源于stack exchange,提问作者Mandy Bunke
相关产品推荐
相关产品推荐

