为何scale_x_discrete会导致ggplot绘图出现多余空白?
解决ggplot手动设置x轴标签后出现多余空白的问题
我用R绘图时,手动重命名x轴标签后,绘图两侧出现了奇怪的多余空白。移除scale_x_discrete可以解决空白问题,但没法正确设置x轴标签(只有两个时间点,不能显示1.25、1.5这类刻度,需要显示“Pre”和“Post”)。尝试用xlim还报错了。
我的代码
ACL_data_frame <- data.frame(ACLdata, Pre_PHQ_Score, Post_PHQ_Score) colnames(ACL_data_frame)[c(328:329)] <- c("PHQ.1", "PHQ.2") ACL_data_frame_long <- reshape(ACL_data_frame, direction="long", varying=328:329, sep=".") ACL_data_frame_long$Condition <- factor(ACL_data_frame_long$Condition) ggplot(data = ACL_data_frame_long, aes(x = time, y = PHQ, linetype = Condition)) + stat_summary(fun=mean, geom="line", size=1.25) + labs(x="Time", y="Depression (PHQ-9)") + scale_x_discrete(limits=c("1","2"), labels=c("Pre", "Post")) + scale_linetype_discrete(name="Condition", breaks=c("1", "2"), labels=c("Control", "Intervention"))
数据示例
| time | PHQ | Condition |
|---|---|---|
| 1 | 0.6666667 | 1 |
| 1 | 1.1111111 | 2 |
| 2 | 0.7777778 | 2 |
| 2 | 1.3333333 | 1 |
绘图情况
- 使用
scale_x_discrete的绘图:标签正确但边距异常 - 未使用
scale_x_discrete的绘图:边距正常但标签错误
解决方案
问题核心:你的time列是数值型,用scale_x_discrete强制将其按离散轴处理时,ggplot仍保留了原数值轴的范围,因此出现两侧空白。以下两种方法可以解决:
方法一:将time转换为因子型
在数据预处理阶段把time转成因子,让ggplot默认按离散轴处理,自然不会出现多余空白:
# 转换time为因子并直接设置标签 ACL_data_frame_long$time <- factor(ACL_data_frame_long$time, levels = c("1", "2"), labels = c("Pre", "Post")) # 绘图代码无需scale_x_discrete ggplot(data = ACL_data_frame_long, aes(x = time, y = PHQ, linetype = Condition)) + stat_summary(fun=mean, geom="line", size=1.25) + labs(x="Time", y="Depression (PHQ-9)") + scale_linetype_discrete(name="Condition", breaks=c("1", "2"), labels=c("Control", "Intervention"))
方法二:保留数值型time,用scale_x_continuous自定义刻度
如果不想修改数据类型,可使用连续型轴,手动指定刻度位置和标签,同时通过expand参数消除空白:
ggplot(data = ACL_data_frame_long, aes(x = time, y = PHQ, linetype = Condition)) + stat_summary(fun=mean, geom="line", size=1.25) + labs(x="Time", y="Depression (PHQ-9)") + scale_x_continuous(breaks = c(1, 2), labels = c("Pre", "Post"), expand = c(0, 0)) + # 消除两侧空白,若刻度太贴边缘可改成c(0, 0.1) scale_linetype_discrete(name="Condition", breaks=c("1", "2"), labels=c("Control", "Intervention"))
内容的提问来源于stack exchange,提问作者Emerson Hardebeck
相关产品推荐
相关产品推荐

