You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用R语言layout()函数创建指定布局的多图图形

解决R语言多图两行居中布局问题

嘿,我来帮你搞定这个绘图布局的难题!你想要的是第一行并排两个图,第二行的图正好落在这两个图的中间位置,对吧?下面给你两种实用的解决方案,优先推荐patchwork包——它的布局语法非常直观,新手也容易上手。

方法一:使用patchwork包(推荐)

patchwork是专门用于组合ggplot图形的工具,能轻松实现各种复杂布局。

步骤1:补全你的饼图函数(适配常见数据结构)

先帮你补全未写完的pie_chart函数,确保它能正常生成饼图:

library(ggplot2)
library(dplyr)

pie_chart <- function(parameter, title = parameter) {
  parameter_df <- parameter_results %>%
    select(results = parameter) %>%
    filter(results != "Not Applicable") %>%  # 过滤无效值
    count(results) %>%
    mutate(percent = n / sum(n))  # 计算分类占比
  
  ggplot(parameter_df, aes(x = "", y = percent, fill = results)) +
    geom_bar(stat = "identity", width = 1) +
    coord_polar("y", start = 0) +  # 转换为饼图
    labs(title = title, x = "", y = "") +
    theme_void()  # 去除冗余坐标轴元素
}

步骤2:准备示例数据与绘图对象

我模拟一份和你数据结构类似的示例数据,生成三个需要组合的图(两个饼图+一个第二行的目标图):

library(patchwork)

# 模拟你的数据
set.seed(123)
parameter_results <- tibble::tibble(
  A = sample(c("Yes", "No", "Not Applicable"), 100, replace = TRUE),
  B = sample(c("High", "Medium", "Low", "Not Applicable"), 100, replace = TRUE),
  C = sample(c("Male", "Female", "Not Applicable"), 100, replace = TRUE)
)

# 生成三个图
p1 <- pie_chart("A", title = "Category A")
p2 <- pie_chart("B", title = "Category B")
p3 <- ggplot(parameter_results, aes(x = C)) +
  geom_bar(fill = "steelblue") +
  labs(title = "Category C Distribution", x = "", y = "Count") +
  theme_minimal()

步骤3:实现目标布局

通过plot_spacer()占位,配合plot_layout()调整宽度比例,让第二行的图正好居中在第一行两个图的中间:

# 组合布局:第一行两个饼图,第二行用占位符把目标图挤到中间
final_plot <- (p1 + p2) / (plot_spacer() + p3 + plot_spacer()) +
  plot_layout(widths = c(1, 2, 1))  # 第二行宽度比例:占位符1份,图2份,占位符1份

# 可选:统一调整所有图的标题居中
final_plot & theme(plot.title = element_text(hjust = 0.5))

方法二:使用gridExtra包

如果你习惯用gridExtra,也可以通过布局矩阵实现相同效果:

library(gridExtra)

# 定义布局矩阵:3列,第一行放p1和p2,第二行中间放p3,其余位置留空
layout_matrix <- rbind(
  c(1, 2, NA),
  c(NA, 3, NA)
)

# 组合图形
grid.arrange(p1, p2, p3, layout_matrix = layout_matrix)

这样就能完美实现你想要的布局啦!如果你的实际数据或图形有特殊调整需求,只需要修改对应部分的代码即可。

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

火山引擎 最新活动