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

如何将国家字符码适配到ggvenn绘制的维恩图圆圈内?

解决ggvenn中国家ISO3C代码多列排布的问题

问题背景

使用Correlates of War的state_year_formatv3数据集,通过R的haven、tidyverse、ggvenn、countrycode包处理1975年GATT与CMEA成员国数据,绘制维恩图时,设置label_sep为,或\n都无法让ISO3C字符码在圆圈内合理排布,需要实现多列展示。


方案1:手动拆分元素并添加注释(基于ggvenn)

ggvenn的show_elements参数只能用单一分隔符拼接所有元素,无法自动分多列。可以先将每个集合的元素按指定数量分组换行,再通过annotate手动添加到图中:

library("haven")
library("tidyverse")
library("ggvenn")
library("countrycode")

# 读取并处理数据
data <- read_dta("state_year_format3.dta")
data$cntry <- countrycode(data$ccode, origin = 'cown', destination =  'iso3c')

dta <- data %>% 
  filter(year == 1975) %>% 
  select(year, cmea, gatt,cntry)

# 提取各集合国家
GATT <- dta %>% filter(gatt == 1) %>% pull(cntry)
CMEA <- dta %>% filter(cmea == 1) %>% pull(cntry)
both <- dta %>% filter(gatt == 1 & cmea == 1) %>% pull(cntry)

# 定义函数:按指定数量拆分向量并生成换行文本
split_to_lines <- function(vec, n_per_line = 3) {
  split_groups <- split(vec, ceiling(seq_along(vec)/n_per_line))
  sapply(split_groups, paste, collapse = " ") %>% 
    paste(collapse = "\n")
}

# 生成带换行的文本
gatt_text <- split_to_lines(GATT, 3)
cmea_text <- split_to_lines(CMEA, 3)
both_text <- split_to_lines(both, 2)

# 绘制维恩图,手动添加注释
ggvenn(list(GATT = GATT, CMEA = CMEA), show_elements = FALSE) +
  annotate("text", x = -0.5, y = 0, label = gatt_text, size = 3, hjust = 0.5) +
  annotate("text", x = 0.5, y = 0, label = cmea_text, size = 3, hjust = 0.5) +
  annotate("text", x = 0, y = 0, label = both_text, size = 3, hjust = 0.5)

可调整n_per_line参数控制每行显示的ISO3C代码数量,以及annotate中的x、y坐标微调文本位置。


方案2:改用VennDiagram包自动处理多列

VennDiagram包原生支持元素的多列排布,无需手动拆分,适合快速实现需求:

library("haven")
library("tidyverse")
library("countrycode")
library(VennDiagram)

# 读取并处理数据(同方案1)
data <- read_dta("state_year_format3.dta")
data$cntry <- countrycode(data$ccode, origin = 'cown', destination =  'iso3c')

dta <- data %>% 
  filter(year == 1975) %>% 
  select(year, cmea, gatt,cntry)

GATT <- dta %>% filter(gatt == 1) %>% pull(cntry)
CMEA <- dta %>% filter(cmea == 1) %>% pull(cntry)

# 绘制维恩图
venn_plot <- venn.diagram(
  x = list(GATT = GATT, CMEA = CMEA),
  filename = NULL, # 直接在绘图窗口输出
  fill = c("#619CFF", "#F8766D"),
  cat.cex = 1.2, # 类别标签字号
  cex = 0.9, # 元素字号
  print.mode = "raw", # 显示元素而非数量
  main = "1975年GATT与CMEA成员国分布",
  main.cex = 1.3
)

# 输出图形
grid.draw(venn_plot)

该方案会自动将元素分成多列适配圆圈大小,无需手动调整换行,缺点是绘图风格基于grid系统,无法与ggplot2的图层兼容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24