You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旋转X轴标签时出现轴间隙及标签溢出绘图区域的问题

解决ggplot2旋转X轴标签时的间隙与溢出问题

我之前也碰到过一模一样的情况,这主要是theme_hc()主题的默认布局设置,加上旋转标签后绘图区域边距不足导致的。先把你的问题和复现内容整理清楚,再给你具体的解决办法:

问题复现

当给X轴标签设置angle=60时,会出现两个明显问题:

  • 标签和X轴之间出现不必要的间隙
  • 部分较长的标签(比如"Turkmenistan")超出了绘图区域的底部边界

而当标签不旋转或者设置angle=90时,这些问题就消失了。你的复现代码和对应的现象如下:

复现代码

library(ggplot2) 
library(ggthemes) 

df <- data.frame(
  country=c("Malaysia", "Mongolia", "Kazakhstan", "China", "Indonesia", "Philippines", 
            "Turkmenistan", "Maldives", "Pakistan", "Bhutan", "Thailand" ,"Myanmar", 
            "India", "Bangladesh", "Afghanistan", "Nepal"), 
  Urbanization_Rate=c(72.8, 68.5, 53.6, 50.6, 50.7, 48.8, 48.7, 41.2, 36.2, 35.6, 
                      34.1, 32.6, 31.3, 28.4, 23.5, 17)
)

ggplot(df, aes(x = reorder(country, -Urbanization_Rate), y = Urbanization_Rate)) + 
  geom_bar(stat = "identity", fill="darkseagreen3") + 
  theme(axis.text.x=element_text(angle=60,vjust = 0.3, hjust=1,size=15)) + 
  theme(axis.text.y = element_text(size=13)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, 80), breaks=c(10,20, 30, 40,50,60,70,80)) + 
  theme_hc() + 
  theme(axis.title.x = element_blank())

现象对比

  • 旋转60度后的图表:
    旋转标签后的图表
  • 未旋转(或90度旋转)的图表:
    未旋转标签的图表

解决方案

针对这两个问题,我们可以通过调整标签对齐参数和绘图边距来解决:

方法1:调整标签对齐与底部边距

核心是把vjust设为1(让标签底部贴近X轴,消除间隙),同时增加绘图区域的底部边距,给旋转后的标签足够的显示空间:

ggplot(df, aes(x = reorder(country, -Urbanization_Rate), y = Urbanization_Rate)) + 
  geom_bar(stat = "identity", fill="darkseagreen3") + 
  # 调整vjust为1,让标签垂直对齐到X轴
  theme(axis.text.x=element_text(angle=60, vjust = 1, hjust=1, size=15)) + 
  theme(axis.text.y = element_text(size=13)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, 80), breaks=c(10,20, 30, 40,50,60,70,80)) + 
  theme_hc() + 
  theme(
    axis.title.x = element_blank(),
    # 增加底部边距,单位pt,可根据标签长度调整
    plot.margin = margin(b = 40, unit = "pt")
  )

方法2:用coord_cartesian优化Y轴范围设置

有时候scale_y_continuous()的limits会影响轴布局,改用coord_cartesian()来设置Y轴范围,能避免不必要的裁剪,配合边距调整效果更好:

ggplot(df, aes(x = reorder(country, -Urbanization_Rate), y = Urbanization_Rate)) + 
  geom_bar(stat = "identity", fill="darkseagreen3") + 
  theme(axis.text.x=element_text(angle=60, vjust = 1, hjust=1, size=15)) + 
  theme(axis.text.y = element_text(size=13)) + 
  scale_y_continuous(expand = c(0, 0), breaks=c(10,20, 30, 40,50,60,70,80)) + 
  # 用coord_cartesian设置Y轴范围,不裁剪绘图元素
  coord_cartesian(ylim = c(0, 80)) + 
  theme_hc() + 
  theme(
    axis.title.x = element_blank(),
    plot.margin = margin(b = 40, unit = "pt")
  )

小提示

  • vjust的取值可以根据旋转角度微调:比如angle=45时,vjust=0.9可能更合适;
  • plot.margin的b值可以按需调整,如果标签更长,就把数值调大一点;
  • 其他自定义主题(比如theme_bw())也可能出现类似问题,这套调整逻辑同样适用。

内容的提问来源于stack exchange,提问作者ePoQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:43