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

如何用ggplot2居中条形图及标题并解决PDF显示不全问题

解决R Markdown生成PDF时ggplot图表居中+内容显示不全的问题

问题根源

你的代码存在两个核心问题:

  1. YAML配置格式错误:缩进混乱导致PDF布局参数失效,且未设置图表居中的全局选项;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:32:22