根据不同数据框中的值仅对特定国家/地区着色

Color only specific countries based on values in a different data frame

我是 R 的初学者,我正在尝试制作一张世界地图,它会根据存储在另一个数据框中的人均 GDP 为特定国家着色。这是我的代码(在线找到):

install.packages(c("cowplot", "googleway", "ggplot2", "ggrepel", "ggspatial", "libwgeom", "sf", "rnaturalearth", "rnaturalearthdata", "rgeos"))

library("ggplot2")
theme_set(theme_bw())
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")
library("rgeos")

world <- ne_countries(scale = "medium", returnclass = "sf")

ggplot(data = world) +
geom_sf() +
xlab("Longitude") + ylab("Latitude") +
ggtitle("World map", subtitle = paste0("(", length(unique(world$name)), " countries)"))

这带来了一张包含 241 个国家/地区的地图。然而,我的 GDP 数据框只存储了 182 个国家的信息。因此,当尝试使用 FILL= 时,我收到错误消息:

ggplot(data = world) +
geom_sf(aes(fill = GDP.data$`US$`)) +
scale_fill_viridis_c(option = "plasma", trans = "sqrt") 
Error: Aesthetics must be either length 1 or the same as the data (241): fill

我怎样才能克服这个问题并仍然让 R 为我数据框中的那些国家着色?

非常感谢!

这是一个工作示例,遵循@stefan 关于将数据加入地图数据框的建议。

在此示例中,我创建了一个有限的数据框,其中包含选定国家/地区的 gdp 信息 my_gdp

gdp_data <- data.frame(
  name = c("Australia", "China", "Brazil"),
  my_gdp = c(1.43, 13.61, 1.86)
)

       name my_gdp
1 Australia   1.43
2     China  13.61
3    Brazil   1.86

您可以 merge(或使用 dplyr::left_join),这样 my_gdp 将被添加到您的 world 数据框中。使用 all.x 将确保所有国家仍保留用于绘图,并在没有 gdp 值的地方填写 NA

plot_data <- merge(world, gdp_data, by = "name", all.x = TRUE)

然后,您仅使用此最终数据框 plot_data 来创建绘图。这比在 ggplot 中引用两个不同的数据框更容易管理,并确保您有相同数量的数据行来绘制国家和填写 gdp。

ggplot(data = plot_data) +
  geom_sf(aes(fill = my_gdp)) +
  scale_fill_viridis_c(option = "plasma", trans = "sqrt") +
  ggtitle("World map (GDP in trillions $)", subtitle = paste0("(", length(unique(world$name)), " countries)"))

情节