首页 > 解决方案 > 我可以用 R 中的提示功能制作世界地图吗?

问题描述

我是编程新手,我偶然发现了一些我无法解决的问题,我希望你们能解决。

我正在使用 FIFA 19 数据集。请参阅下面的数据集的一部分:

               Name Nationality Overall                Club Balance
1          L. Messi   Argentina      94        FC Barcelona      95
2 Cristiano Ronaldo    Portugal      94            Juventus      70
3         Neymar Jr      Brazil      92 Paris Saint-Germain      84
4            De Gea       Spain      91   Manchester United      43
5      K. De Bruyne     Belgium      91     Manchester City      77
6         E. Hazard     Belgium      91             Chelsea      94

我想要的是一张世界地图,您可以在其中插入带有 readline(prompt) 功能的俱乐部,然后为您提供该俱乐部的所有球员的地图,然后显示这些球员来自世界的哪个地方(所以计数每个俱乐部的每个国籍,如果有道理的话)。

我在以下网站上看到了如何制作这个数据集的世界地图。

https://medium.com/@emrerencberoglu/visualization-of-fifa-2019-player-ratings-on-world-map-with-r-3c169a13347b

制作总玩家人数的世界地图(因此对于整个数据集)的代码如下。它给了我正确的输出。

overall_data <- fifa %>% 
  group_by(Nationality) %>% 
  summarise(Count = n(), 
            Avg_Overall = mean(Overall),
            Avg_Potential = mean(Potential),
            Avg_Pot_Diff = mean(Potential-Overall))

worldmap = map_data("world")

merged_data <- merge(x = worldmap, y = overall_data, by.x = "region", by.y = "Nationality", all.x = TRUE) %>% arrange(order)

ggplot(data = merged_data, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = Count)) +
  labs(fill='Total Player Counts')

即,这个世界地图: Worldmap Total Player Count

但这不允许我为每个俱乐部制作不同的地图。所以我制作了一个单独的数据文件,记录每个俱乐部,每个国家有多少人。我使用来自此来源的 crosstab() 函数制作了一个交叉表:(“http://pcwww.liv.ac.uk/~william/R/crosstab.r”)。这是我使用的代码:

nat_per_club <- crosstab(fifa, row.vars = "Nationality", col.vars = "Club", type ="f")
nat_per_club_crosstab <- nat_per_club$crosstab
nat_per_club_dataframe <- data.frame(nat_per_club_crosstab)
nat_per_club_dataframe <- nat_per_club_dataframe[!(nat_per_club_dataframe$Freq==0), ]

这给了我下表:

    Nationality                 Club Freq
8       Armenia  SSV Jahn Regensburg    1
60      Germany  SSV Jahn Regensburg   19
87       Kosovo  SSV Jahn Regensburg    1
94    Lithuania  SSV Jahn Regensburg    1
104     Morocco  SSV Jahn Regensburg    1
121      Poland  SSV Jahn Regensburg    1

这正是我想要的,因为它显示了每个俱乐部和每个国家的频率。现在的问题是,如何使用 readline(prompt) 函数在世界地图中实现它。因此,如果我插入例如 SSV Jahn Regensburg,它会向我显示他们的球员来自世界哪个地方的世界地图?

这是我尝试过的,但不幸的是它不起作用。

worldmap2 = map_data("world")

merged_data2 <- merge(x = worldmap2, y = nat_per_club_dataframe, by.x = "region", by.y = "Nationality", all.x = TRUE) %>% arrange(order)

ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = Freq)) +
  labs(fill='Total Player Count')

players_from_where <- function() {
  club_name <- as.character(readline(prompt="Club: "))
  for(i in 1:nrow(nat_per_club_dataframe)){
    if(nat_per_club_dataframe[i, "Club"] == club_name){
    ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
    geom_polygon(aes(fill = Freq)) +
    labs(fill='Total Player Counts')
    }
  }
}

我希望有人能帮帮忙!

标签: rggplot2maps

解决方案


不需要for循环。dplyr::filter您可以简单地使用或为输入的俱乐部名称过滤聚合数据集subset,将其合并到地图数据并绘制。

library(tidyverse)

players_from_where <- function(club_name) {
  x <- filter(nat_per_club_dataframe, Club %in% club_name)

  worldmap <- map_data("world")

  merged_data2 <- merge(x = worldmap, y = x, by.x = "region", by.y = "Nationality", all.x = TRUE) %>%
    arrange(order)

  ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
    geom_polygon(aes(fill = n)) +
    labs(fill = "Total Player Counts")
}

# club_name <- as.character(readline(prompt = "Club: "))
club_name <- "FC Barcelona"

players_from_where(club_name)

数据

nat_per_club_dataframe <- structure(list(Nationality = c(
  "Argentina", "Belgium", "Brazil",
  "Chile", "Croatia", "France", "Germany", "Netherlands", "Portugal",
  "Senegal", "Spain", "Uruguay", "Austria", "Brazil", "Colombia",
  "France", "Germany", "Netherlands", "Poland", "Portugal", "Spain"
), Club = c(
  "FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
  "FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
  "FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
  "FC Bayern München", "FC Bayern München", "FC Bayern München",
  "FC Bayern München", "FC Bayern München", "FC Bayern München",
  "FC Bayern München", "FC Bayern München", "FC Bayern München"
), n = c(
  1L, 1L, 4L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 17L, 1L, 1L,
  1L, 1L, 3L, 18L, 1L, 1L, 1L, 2L
)), class = "data.frame", row.names = c(
  NA,
  -21L
))

推荐阅读