如何用ggplot2居中条形图及标题并解决PDF显示不全问题
解决R Markdown生成PDF时ggplot图表居中+内容显示不全的问题
问题根源
你的代码存在两个核心问题:
- YAML配置格式错误:缩进混乱导致PDF布局参数失效,且未设置图表居中的全局选项;
- ggplot布局不合理:标题设为左对齐、边距设置颠倒、百分比文本超出画布范围,还存在重复的线条代码。
修正步骤
1. 修复YAML配置
先修正YAML的缩进和格式,同时添加图表居中的全局设置:
--- title: "报告标题" output: pdf_document: fig_caption: yes fig.align: "center" # 全局设置所有图表居中 geometry: - top=1.8cm - left=2cm - bottom=1.5cm - right=2cm - paper=a4paper header-includes: - \usepackage{lscape} ---
注意:YAML对缩进要求严格,每个层级必须对齐;
fig.align: center会让图表整体在PDF页面中居中。
2. 调整ggplot代码
针对图表显示不全和标题居中问题,修改R代码如下:
library(dplyr) library(ggplot2) library(stringr) # 处理长文本自动换行 set.seed(456) base <- data.frame( AÑO = rep(2024, 100), ENFERMEDAD = sample(1:6, 100, replace = TRUE) ) base %>% filter(AÑO == 2024) %>% mutate(ENFERMEDAD = as.character(ENFERMEDAD)) %>% mutate(ENFERMEDAD = case_when( ENFERMEDAD == "1" ~ "Enfermedades Respiratorias", ENFERMEDAD == "2" ~ "Diabetes", ENFERMEDAD == "3" ~ "Hipertensión", ENFERMEDAD == "4" ~ "Enfermedades Cardiovasculares", ENFERMEDAD == "5" ~ "Cáncer", ENFERMEDAD == "6" ~ "Enfermedades Infecciosas" )) %>% # 给长疾病名称自动换行,减少标签宽度 mutate(ENFERMEDAD = str_wrap(ENFERMEDAD, width = 15)) %>% count(ENFERMEDAD) %>% arrange(desc(n)) %>% mutate(PORCENTAJE = paste0(round(n / sum(n) * 100, digits = 0), "%")) %>% ggplot(aes(x = reorder(ENFERMEDAD, n), y = n)) + geom_bar(stat = "identity", width = 0.7, color = "black", fill = "steelblue") + geom_text(aes(label = PORCENTAJE), vjust = 0.5, hjust = -0.1, colour = "black", size = 3) + # 扩展y轴右侧空间,避免百分比文本超出画布 scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + labs( title = "Número de Casos Reportados por Tipo de Enfermedad en 2024", subtitle = "(Datos simulados para fines de demostración)", caption = "", x = "", y = "" ) + theme( # 设置标题和副标题居中 plot.title = element_text(size = 15, face = "plain", hjust = 0.5), plot.subtitle = element_text(size = 10, face = "plain", hjust = 0.5), panel.background = element_blank(), axis.text.y = element_text(size = 8), # 调整边距:上、右、下、左,适配coord_flip后的坐标轴布局 plot.margin = margin(1, 2, 1, 1, "cm"), # 用axis.line替代重复的线条代码,更简洁 axis.line = element_line(color = "black", linewidth = 0.5) ) + coord_flip()
关键修改点说明
- 标题居中:将
plot.title和plot.subtitle的hjust参数设为0.5; - 解决内容截断:
- 用
str_wrap给长疾病名称自动换行,压缩标签宽度; - 用
scale_y_continuous(expand = ...)给百分比文本预留显示空间; - 调整
plot.margin,增大右边距、缩小左边距,适配翻转后的坐标轴;
- 用
- 简化代码:删除重复的
geom_vline/geom_hline,用axis.line直接设置轴线条; - 全局居中:YAML中的
fig.align: center确保整个图表模块在PDF页面中居中。
内容的提问来源于stack exchange,提问作者Belen Rios
相关产品推荐
相关产品推荐

