如何创建带有热图的世界地图

Posted

技术标签:

【中文标题】如何创建带有热图的世界地图【英文标题】:How do I create a world map with a heat map on top of it 【发布时间】:2022-01-13 22:29:26 【问题描述】:

我一直在尝试在 R 中创建一个世界地图,上面覆盖了一个热图。我有一个名为 mydata 的数据框,其中有 2 列,第一列是带有 ISO3 国家代码的 country_code_author1,第二列称为“n”,其中包含每个国家/地区拥有多少出版物的计数。我在下面附上了我正在使用的代码,但是当我运行它时它只会在美国产生一个热补丁。我在下面附上了我的数据框的图片。

library(maps)
library(ggplot2)

mydata <- df_country_count_auth1

world_map <- map_data("world")
world_map <- subset(world_map, region != "Antarctica")

ggplot(mydata) +
  geom_map(
    dat = world_map, map = world_map, aes(map_id = region),
    fill = "white", color = "#7f7f7f", size = 0.25
  ) +
  geom_map(map = world_map, aes(map_id = country_code_author1, fill = n), size = 0.25) +
  scale_fill_gradient(low = "#fff7bc", high = "#cc4c02", name = "Worldwide Publications") +
  expand_limits(x = world_map$long, y = world_map$lat)

迷你版数据框的代码/结构

myData <-
  structure(
    list(
      country_code_author1 = c(
        "AGO",
        "AIA",
        "ALB",
        "ARE",
        "ARG",
        "ARM",
        "ATG",
        "AUS",
        "AUT",
        "AZE"
      ),
      n = c(3L, 1L,
            11L, 3L, 38L, 1L, 4L, 240L, 98L, 23L)
    ),
    row.names = c(NA,-10L),
    groups = structure(
      list(
        country_code_author1 = c(
          "AGO",
          "AIA",
          "ALB",
          "ARE",
          "ARG",
          "ARM",
          "ATG",
          "AUS",
          "AUT",
          "AZE"
        ),
        .rows = structure(
          list(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L),
          ptype = integer(0),
          class = c("vctrs_list_of",
                    "vctrs_vctr", "list")
        )
      ),
      row.names = c(NA,-10L),
      class = c("tbl_df",
                "tbl", "data.frame"),
      .drop = TRUE
    ),
    class = c("grouped_df",
              "tbl_df", "tbl", "data.frame")
  )

What I am trying to accomplish

【问题讨论】:

嗨@Aarav,请使用dput()而不是屏幕截图提供您的数据。 嗨@Phil 感谢您的评论,我刚刚更新了我的帖子以包含我的 df 的结构 【参考方案1】:

首先,我可以看到你从here复制了上面的代码,甚至不明白其中发生了什么。

不管怎样,在第二个geom_map里面你犯了错误。

如果您在控制台中打印了world_map,您会发现:

> head(world_map)
       long      lat group order region subregion
1 -69.89912 12.45200     1     1  Aruba      <NA>
2 -69.89571 12.42300     1     2  Aruba      <NA>
3 -69.94219 12.43853     1     3  Aruba      <NA>
4 -70.00415 12.50049     1     4  Aruba      <NA>
5 -70.06612 12.54697     1     5  Aruba      <NA>
6 -70.05088 12.59707     1     6  Aruba      <NA>

从中可以看出,您需要国家名称而不是它们的缩写才能获得地理热图。

因此,首先,您需要使用包countrycode 从国家代码中获取国家名称。

library(countrycode)
countryName <- countrycode(myCodes, "iso3c", "country.name")
countryName

这会给你这样的输出:

> countryName
 [1] "Angola"               "Anguilla"             "Albania"             
 [4] "United Arab Emirates" "Argentina"            "Armenia"             
 [7] "Antigua & Barbuda"    "Australia"            "Austria"             
[10] "Azerbaijan"      

现在,您需要将其添加到原始数据框中。

myData <- cbind(myData, country = countryName)

geom_map 中的最后一个错误是您传递的map_id,它应该始终是国家/地区名称。因此,您需要将其更改为 country

最终代码如下所示:

library(maps)
library(ggplot2)
library(countrycode)

myCodes <- myData$country_code_author1
countryName <- countrycode(myCodes, "iso3c", "country.name")
myData <- cbind(myData, country = countryName)

#mydata <- df_country_count_auth1

world_map <- map_data("world")
world_map <- subset(world_map, region != "Antarctica")

ggplot(myData) +
  geom_map(
    dat = world_map, map = world_map, aes(map_id = region),
    fill = "white", color = "#7f7f7f", size = 0.25
) +
  geom_map(map = world_map, aes(map_id = country, fill = n), size = 0.25) +
  scale_fill_gradient(low = "#fff7bc", high = "#cc4c02", name = "Worldwide Publications") +
  expand_limits(x = world_map$long, y = world_map$lat)

输出如下所示:

【讨论】:

以上是关于如何创建带有热图的世界地图的主要内容,如果未能解决你的问题,请参考以下文章

R:如何使用 ggplot2 创建一个半色半数的热图?

我可以在地理地图上叠加 ggplot 热图吗?

带有日期时间轴的 Seaborn 热图

如何在分层热图树状图中添加聚类矩形

来自带有 NaN 的 pandas 数据框的 seaborn 热图

绘制聚类热图(带树状图)/Python