如何将国家字符码适配到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
相关产品推荐
相关产品推荐

