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

