如何绘制一个国家的区域,每个区域都有相应的值
How to plot regions in a country, each shaded by some corresponding value
特别是我在印度有一组不同的区域,每个区域都有一个 "marketshare" 值。
regions <- data.frame(Region=c("TELANGANA", "TAMIL NADU", "JAMMU & KASHMIR"), Marketshare=c(.25, .30, .15))
regions
Region Marketshare
1 TELANGANA 0.25
2 TAMIL NADU 0.30
3 JAMMU & KASHMIR 0.15
我可以使用 ggmap
真正轻松地绘制印度
library(ggmap)
map <- get_map("India", zoom=6, maptype="toner-lite")
ggmap(map)
但是我怎样才能明确地将这些区域包括在我的数据集中并使用列 市场份额?
对每个区域进行着色
注意:我见过 this question and answer,但它似乎对我的需求来说过于复杂,想知道是否有更简单的方法。
正如hrbrmstr所说,我认为如果你能展示你所做的一些努力就太好了。在这里,我创建了两个地图。第一个是 ggmap,另一个是 ggplot。在您的示例代码中,您的地图缩放已关闭,以显示您指定的所有三个区域。所以我修改了你的代码。您在地图顶部需要的是您想要的区域的多边形。为了获得它们,您使用 get_data()
下载数据。然后,您需要对其进行子集化。正如链接的问题所示,您需要通过合并过程才能将 marketshare
添加到最终数据框。我收集了每个区域的 ID,并创建了一个 marketshare
的数据框,即 foo
。 temp
是包含多边形信息以及 marketshare
的最终数据框。您使用 marketshare
代替 fill
并绘制地图。
library(raster)
library(ggmap)
library(ggplot2)
### Get India data
india <- getData("GADM", country = "India", level = 2)
map <- get_map("India", zoom = 4, maptype = "toner-lite")
regions <- data.frame(Region=c("Telangana", "Tamil Nadu", "Jammu and Kashmir"), Marketshare=c(.25, .30, .15))
states <- subset(india, NAME_1 %in% regions$Region)
ind1 <- states$ID_2[states$NAME_1 == "Telangana"]
ind2 <- states$ID_2[states$NAME_1 == "Tamil Nadu"]
ind3 <- states$ID_2[states$NAME_1 == "Jammu and Kashmir"]
states <- fortify(states)
foo <- data.frame(id = c(ind1, ind2, ind3),
marketshare = rep(regions$Marketshare, times = c(length(ind1), length(ind2), length(ind3))))
temp <- merge(states, foo, by = "id")
ggmap(map) +
geom_map(data = temp, map = temp,
aes(x = long, y = lat, map_id = id, group = group, fill = marketshare),
colour = "grey50", size = 0.3) +
theme(legend.position = "none")
或者,您可以使用 ggplot 绘制地图,以便只显示印度。在这种情况下,您从下载数据 india
创建一个数据框。您绘制一次印度,然后在地图顶部绘制特定区域。由于颜色原因,我在这里将 marketshare
转换为因子。
india.map <- fortify(india)
ggplot() +
geom_map(data = india.map, map = india.map,
aes(x = long, y = lat, map_id = id, group = group),
colour = "grey50", size = 0.3) +
geom_map(data = temp, map = temp,
aes(x = long, y = lat, map_id = id, group = group, fill = factor(marketshare)),
colour = "grey50", size = 0.3) +
theme(legend.position = "none")
特别是我在印度有一组不同的区域,每个区域都有一个 "marketshare" 值。
regions <- data.frame(Region=c("TELANGANA", "TAMIL NADU", "JAMMU & KASHMIR"), Marketshare=c(.25, .30, .15))
regions
Region Marketshare
1 TELANGANA 0.25
2 TAMIL NADU 0.30
3 JAMMU & KASHMIR 0.15
我可以使用 ggmap
真正轻松地绘制印度
library(ggmap)
map <- get_map("India", zoom=6, maptype="toner-lite")
ggmap(map)
但是我怎样才能明确地将这些区域包括在我的数据集中并使用列 市场份额?
对每个区域进行着色注意:我见过 this question and answer,但它似乎对我的需求来说过于复杂,想知道是否有更简单的方法。
正如hrbrmstr所说,我认为如果你能展示你所做的一些努力就太好了。在这里,我创建了两个地图。第一个是 ggmap,另一个是 ggplot。在您的示例代码中,您的地图缩放已关闭,以显示您指定的所有三个区域。所以我修改了你的代码。您在地图顶部需要的是您想要的区域的多边形。为了获得它们,您使用 get_data()
下载数据。然后,您需要对其进行子集化。正如链接的问题所示,您需要通过合并过程才能将 marketshare
添加到最终数据框。我收集了每个区域的 ID,并创建了一个 marketshare
的数据框,即 foo
。 temp
是包含多边形信息以及 marketshare
的最终数据框。您使用 marketshare
代替 fill
并绘制地图。
library(raster)
library(ggmap)
library(ggplot2)
### Get India data
india <- getData("GADM", country = "India", level = 2)
map <- get_map("India", zoom = 4, maptype = "toner-lite")
regions <- data.frame(Region=c("Telangana", "Tamil Nadu", "Jammu and Kashmir"), Marketshare=c(.25, .30, .15))
states <- subset(india, NAME_1 %in% regions$Region)
ind1 <- states$ID_2[states$NAME_1 == "Telangana"]
ind2 <- states$ID_2[states$NAME_1 == "Tamil Nadu"]
ind3 <- states$ID_2[states$NAME_1 == "Jammu and Kashmir"]
states <- fortify(states)
foo <- data.frame(id = c(ind1, ind2, ind3),
marketshare = rep(regions$Marketshare, times = c(length(ind1), length(ind2), length(ind3))))
temp <- merge(states, foo, by = "id")
ggmap(map) +
geom_map(data = temp, map = temp,
aes(x = long, y = lat, map_id = id, group = group, fill = marketshare),
colour = "grey50", size = 0.3) +
theme(legend.position = "none")
或者,您可以使用 ggplot 绘制地图,以便只显示印度。在这种情况下,您从下载数据 india
创建一个数据框。您绘制一次印度,然后在地图顶部绘制特定区域。由于颜色原因,我在这里将 marketshare
转换为因子。
india.map <- fortify(india)
ggplot() +
geom_map(data = india.map, map = india.map,
aes(x = long, y = lat, map_id = id, group = group),
colour = "grey50", size = 0.3) +
geom_map(data = temp, map = temp,
aes(x = long, y = lat, map_id = id, group = group, fill = factor(marketshare)),
colour = "grey50", size = 0.3) +
theme(legend.position = "none")