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

如何用ggplot2的facet_grid绘制office列所有离散值组合的散点图?

用ggplot2::facet_grid实现Office全组合散点图网格

需求说明

现有包含district(选区)、office(职位)、margin(得票差)的数据集,需要绘制所有职位两两组合的散点图网格,让每个职位同时作为行和列的分面变量,形成完整的4×4散点图矩阵。

数据集

library(tidyverse)

df <- structure(list(district = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 
3), office = c("GOV", "WAG", "USS", "WST", "GOV", "WAG", "USS", 
"WST", "GOV", "WAG", "USS", "WST"), margin = c(-10.6296758104738, 
-11.0540006895039, -16.2188249213812, -15.4710156423517, -12.7093173035638, 
-12.9545865749955, -17.3703863277323, -17.4593332847035, -10.1910380671443, 
-10.984606653898, -14.8799042051138, -15.8511248029804)), row.names = c(NA, 
-12L), class = c("tbl_df", "tbl", "data.frame"))

解决方案

无需用patchwork拼接,只需先重构数据结构,再用facet_grid一步实现:

方法1:简洁重塑版

# 将数据转宽格式,每个职位的得票差单独成列
df_wide <- df %>% 
  pivot_wider(names_from = office, values_from = margin)

# 构造y轴职位的长格式数据,再交叉所有x轴职位
plot_data <- df_wide %>%
  pivot_longer(cols = GOV:WST, names_to = "y_office", values_to = "y_value") %>%
  crossing(x_office = unique(df$office)) %>%
  mutate(x_value = pull(df_wide, x_office))

# 绘制全组合网格散点图
ggplot(plot_data, aes(x = x_value, y = y_value)) +
  geom_point() +
  facet_grid(y_office ~ x_office) +
  scale_x_continuous(limits = range(df$margin)) +
  scale_y_continuous(limits = range(df$margin)) +
  theme_bw()

方法2:显式映射版(适合新手理解)

# 转宽格式
df_wide <- df %>% 
  pivot_wider(names_from = office, values_from = margin)

# 构造所有行/列职位组合,并映射对应数值
plot_data <- df_wide %>%
  crossing(y_office = unique(df$office), x_office = unique(df$office)) %>%
  mutate(
    y_value = case_when(
      y_office == "GOV" ~ GOV,
      y_office == "WAG" ~ WAG,
      y_office == "USS" ~ USS,
      y_office == "WST" ~ WST
    ),
    x_value = case_when(
      x_office == "GOV" ~ GOV,
      x_office == "WAG" ~ WAG,
      x_office == "USS" ~ USS,
      x_office == "WST" ~ WST
    )
  )

# 绘图
ggplot(plot_data, aes(x = x_value, y = y_value)) +
  geom_point() +
  facet_grid(y_office ~ x_office) +
  scale_x_continuous(limits = range(df$margin)) +
  scale_y_continuous(limits = range(df$margin)) +
  theme_bw()

效果说明

最终会生成4行(对应y轴的4个职位)×4列(对应x轴的4个职位)的散点图网格,每个子图展示对应职位对的得票差关联关系。统一设置轴范围后,所有子图刻度一致,便于跨组对比。

内容的提问来源于stack exchange,提问作者John J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:52:46