根据不同数据框中的值仅对特定国家/地区着色
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)"))
情节
我是 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)"))
情节