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
相关产品推荐
相关产品推荐

