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

如何在R的ggplot2中实现分面图片与分面标签对齐?

R语言分面图图片居中对齐与间距调整方案

问题背景

制作包含圆形裁剪图片的分面图时,出现图片对齐偏移的问题,同时需要自定义分面间的水平/垂直间距。

原始代码

library(tidyverse)
library(showtext)
library(showtextdb)
library(ggtext)
library(magick)
library(ggimage)
library(cropcircles)

bob_ross <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2023/2023-02-21/bob_ross.csv')
bob_ross_top <- bob_ross %>%
  mutate(col_num_n = str_count(colors, ",") + 1) %>%
  arrange(desc(col_num_n)) %>%
  slice(1:10) %>%
  mutate(image = map(img_src, image_read),
         img_circle = circle_crop(img_src, border_size = 12, border_colour = "black"))

ggplot(bob_ross_top, aes(x = painting_title, y = 1, image = img_circle)) +
  geom_image(size = 1) +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  theme_minimal() +
  theme(axis.title = element_blank(), 
        axis.text = element_blank(), 
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        strip.text = element_text(hjust = 0.5)) +
  facet_wrap(~ painting_title, ncol = 2)

异常效果

生成的分面图


解决方案

1. 实现图片居中对齐

原始代码中aes(x = painting_title)将图片绑定到分面的离散x轴标签位置,导致偏移。只需将x、y坐标设为固定的中心值,并限定坐标轴范围:

ggplot(bob_ross_top, aes(x = 0.5, y = 0.5, image = img_circle)) +
  geom_image(size = 1) +
  # 限定坐标轴范围为0-1,确保图片居中
  scale_x_continuous(limits = c(0, 1), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0, 1), expand = c(0, 0)) +
  theme_minimal() +
  theme(axis.title = element_blank(), 
        axis.text = element_blank(), 
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        strip.text = element_text(hjust = 0.5)) +
  facet_wrap(~ painting_title, ncol = 2)

2. 自定义分面间距

通过theme()中的panel.spacing.x和panel.spacing.y参数分别调整水平、垂直间距,支持cm、in、pt等单位:

ggplot(bob_ross_top, aes(x = 0.5, y = 0.5, image = img_circle)) +
  geom_image(size = 1) +
  scale_x_continuous(limits = c(0, 1), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0, 1), expand = c(0, 0)) +
  theme_minimal() +
  theme(axis.title = element_blank(), 
        axis.text = element_blank(), 
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        strip.text = element_text(hjust = 0.5),
        # 自定义水平间距1.2cm,垂直间距1.8cm
        panel.spacing.x = unit(1.2, "cm"),
        panel.spacing.y = unit(1.8, "cm")) +
  facet_wrap(~ painting_title, ncol = 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:45