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

