如何创建带有热图的世界地图
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)
输出如下所示:
【讨论】:
以上是关于如何创建带有热图的世界地图的主要内容,如果未能解决你的问题,请参考以下文章