如何在R中用readline(prompt)输入俱乐部生成FIFA19球员国籍世界地图
修正后可运行的实现方案
你原有代码的核心问题有两点:
- 提前合并了全量俱乐部的国籍统计与地图数据,没有针对输入的俱乐部做筛选,Freq列包含所有俱乐部的计数,无法匹配单俱乐部需求
- 函数内生成的ggplot对象没有显式打印,且用循环逐行匹配俱乐部的写法冗余,无法正确筛选目标数据
以下是可直接运行的完整代码:
# 前置依赖加载(如果还没加载的话请先运行) library(tidyverse) library(maps) # 你已经提前生成好的国籍-俱乐部统计表保留即可,不需要修改 # nat_per_club_dataframe <- ...(原有生成交叉表的代码不变) # 实现查询的函数 players_from_where <- function() { # 读取用户输入的俱乐部名称 club_name <- trimws(as.character(readline(prompt="Club: "))) # 校验俱乐部是否存在 if (!club_name %in% unique(nat_per_club_dataframe$Club)) { stop("输入的俱乐部名称不存在,请检查拼写") } # 筛选对应俱乐部的国籍统计数据 target_club_data <- nat_per_club_dataframe %>% filter(Club == club_name) # 读取世界地图数据 worldmap <- map_data("world") # 合并地图数据与俱乐部国籍统计数据 merged_data <- merge( x = worldmap, y = target_club_data, by.x = "region", by.y = "Nationality", all.x = TRUE ) %>% arrange(order) # 生成并打印地图 p <- ggplot(data = merged_data, aes(x = long, y = lat, group = group)) + geom_polygon(aes(fill = Freq), color = "white", linewidth = 0.1) + # 加国界线更清晰 scale_fill_viridis_c(na.value = "lightgray", name = "球员数量") + # 无数据的国家用浅灰色 labs(title = paste0(club_name, " 球员国籍分布")) + theme_void() # 更干净的地图主题 print(p) } # 调用函数即可触发输入查询 players_from_where()
补充说明
- 代码里增加了输入校验逻辑,如果输入的俱乐部名称拼写错误会直接给出提示
- 优化了地图样式,增加了国界线、无数据国家的背景色,视觉效果更清晰
- 不需要提前合并全量数据,每次查询时只筛选目标俱乐部的数据,运行效率更高
内容的提问来源于stack exchange,提问作者Celine Serry
相关产品推荐
相关产品推荐

