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

ggplot2柱状图X轴标签‘100’超出画布的修复方案咨询

修复ggplot2柱状图X轴标签显示不全的问题

你的ggplot2柱状图代码可正常运行,但存在一处缺陷:生成的图表中X轴最后一个数值“100”几乎完全超出画布范围,显示效果如下:
图表显示效果

原代码如下:

library(dplyr)
library(tidyr)
library(ggplot2)

mydata <- mydata %>%
  mutate(
    variable = recode(
      variable,
      "item3" = "item name here"
    )
  ) %>%
  drop_na() %>%
  mutate(value = recode(value, "1" = "yes", "2" = "no", "3" = "maybe")) %>%
  count(variable, value) |> 
  group_by(variable) |> 
  mutate(pct = n / sum(n))

ggplot(mydata, mapping = aes(x = value, y = pct)) +
  geom_col(aes(fill = value),
           width = 0.30
  ) +
  scale_y_continuous(
    breaks = seq(from = 0, to = 1, by = 0.2),
    minor_breaks = seq(from = 0, to = 1, by = 0.1),
    labels = seq(from = 0, to = 100, by = 20),
    limits = c(0, 1),
    expand = c(0, 0)
  ) +
  scale_fill_manual(
    values = c(yes = "green", no = "red", maybe = "grey80"
               ),
    drop = FALSE
  ) +
  labs(x = "Answer", y = "Percentage") +
  guides(
    fill = "none"
  ) +
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey"),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_line(colour = "lightgrey"),
    axis.ticks.x = element_blank(),
    axis.ticks.y = element_line(colour = "grey"),
    axis.text.x = element_text(
      size = 11,
      face = "bold",
      hjust = 0
    )
  ) +
  coord_flip()

修复方案

问题根源在于coord_flip后的轴空间预留与标签对齐设置,以下是具体修改步骤:

1. 给百分比轴预留末端空间

原代码中scale_y_continuous设置了expand = c(0, 0),这会让刻度完全贴合数据范围,没有额外空间。加上coord_flip后,原本的Y轴(百分比轴)变成了横向的X轴,最后一个刻度“100”就会紧贴画布边缘被截断。

修改scale_y_continuous的expand参数,给末端预留少量空间:

scale_y_continuous(
  breaks = seq(from = 0, to = 1, by = 0.2),
  minor_breaks = seq(from = 0, to = 1, by = 0.1),
  labels = seq(from = 0, to = 100, by = 20),
  limits = c(0, 1),
  expand = c(0, 0.02)  # 给刻度末端增加扩展空间
)

2. 调整翻转后轴标签的对齐方式

coord_flip会交换X/Y轴的显示逻辑,原代码中设置的axis.text.x实际对应翻转后的Y轴(Answer标签),而百分比标签对应的是原来的axis.text.y。将其对齐方式改为右对齐,能避免标签溢出画布:

theme(
  panel.background = element_blank(),
  panel.grid.major = element_line(colour = "grey"),
  panel.grid.major.x = element_blank(),
  panel.grid.minor = element_line(colour = "lightgrey"),
  axis.ticks.x = element_blank(),
  axis.ticks.y = element_line(colour = "grey"),
  axis.text.y = element_text(  # 改为对应翻转后的百分比轴标签
    size = 11,
    face = "bold",
    hjust = 1  # 右对齐让标签贴近刻度线
  )
)

完整修复代码

library(dplyr)
library(tidyr)
library(ggplot2)

mydata <- mydata %>%
  mutate(
    variable = recode(
      variable,
      "item3" = "item name here"
    )
  ) %>%
  drop_na() %>%
  mutate(value = recode(value, "1" = "yes", "2" = "no", "3" = "maybe")) %>%
  count(variable, value) |> 
  group_by(variable) |> 
  mutate(pct = n / sum(n))

ggplot(mydata, mapping = aes(x = value, y = pct)) +
  geom_col(aes(fill = value), width = 0.30) +
  scale_y_continuous(
    breaks = seq(from = 0, to = 1, by = 0.2),
    minor_breaks = seq(from = 0, to = 1, by = 0.1),
    labels = seq(from = 0, to = 100, by = 20),
    limits = c(0, 1),
    expand = c(0, 0.02)
  ) +
  scale_fill_manual(
    values = c(yes = "green", no = "red", maybe = "grey80"),
    drop = FALSE
  ) +
  labs(x = "Answer", y = "Percentage") +
  guides(fill = "none") +
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey"),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_line(colour = "lightgrey"),
    axis.ticks.x = element_blank(),
    axis.ticks.y = element_line(colour = "grey"),
    axis.text.y = element_text(
      size = 11,
      face = "bold",
      hjust = 1
    )
  ) +
  coord_flip()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:50:21