使用ggmap制作基于密度的绘图的世界地图

时间:2015-01-17 15:49:53

标签: r

我想使用ggmap制作一个以日本为中心的世界地图,其中包含基于数量或密度的图。我想创建这样的东西:

我想要使用的数据是:

df  <- read.table(header=F, text=" Japan   3137
 China   542
 Korea   499
 VietNam   423
 Indonesia   261
 Thailand   222
 SriLanka   60
 Taiwan   56
 Taiwan   60
 Bangladesh   51
  Nepal   43
 India   37
 Mongolia   26
 Myanmar  21
 Philippines   16
 Singapore   15
 Cambodia   11
 Malaysia   10
 Pakistan   9
 Lao_People_Democratic_Republic   7
 Brunei_Darussalam   3
 Afghanistan   10
 Iran   2
 Yemen   2
 United_Arab_Emirates   2
 Lebanon   1
 Israel   1
 Kenya   9
 Botswana   7
 Ethiopia   3
 Nigeria   2
 Mozambique   2
  Uganda   2
 Morocco   1
 Ghana   1
 South_Africa   1
 Zimbabwe   1
 America   58
 Canada   5
 UnitedMexicanStates   5
 Brazil   2
 Guyana   2
 AntiguaandBarbuda   1
 Cuba   1
 Nicaragua   1
  Fiji   11
 Australia   6
 Tonga   6
 Samoa   2
 PapuaNewGuinea   1
  Uzbekistan   106
 Norway   10
 KyrgyzRepublic   9
 Germany   7
 Fracne   6
 Tajikistan   6
 Austria   5
 Italy   5
 UK   5
 Belgium   4
 Denmark   4
 Sweden   4
 Finland   4
 Estonia   3
 Lithuania   3
 Russia   3
 Georgia   1
 Netherlands   1
 Portuguese   1
 Iceland   1
 Kazakhstan   1
 Moldova   1
 Poland   1
 Spain   1
 SwissConfedeartion   1
 Ukraine   1")

我键入:require(maps)

     world_map <- map_data("df")

我不知道该怎么办。

1 个答案:

答案 0 :(得分:1)

在重新阅读问题后,有足够的有趣(和相对强硬)的部分,我认为更完整的答案可能对更广泛的SO社区有用。此外,由于OP不知道如何在法线贴图上均匀绘制点,因此使用重新居中的贴图会更难以理解。

第一段代码使用了一个世界地图shapefile,该文件已经重新定位到太平洋(有关如何使用ogr进行操作的一些技巧,请查看here)。它也会移除南极洲。

library(rgdal)
library(rgeos)
library(httr)
library(ggplot2)
library(dplyr)
library(magrittr)
library(countrycode)

# Get Pacific-centered map & remove Antarctica ----------------------------

world_0_360_geojson <- "https://gist.githubusercontent.com/hrbrmstr/1caee1f5e95cc8fa70c2/raw/f4cdd7f34d3a4512cb1c66345d9a5d6149c05c7c/world_0_360.json"
stop_for_status(GET(world_0_360_geojson, write_disk("world_0_360.geojson"), progress()))                

world <- readOGR("world_0_360.geojson", "OGRGeoJSON")
world <- world[!world$iso_a2 %in% c("AQ"),]

world_map <- fortify(world)

下一部分代码采用了可怕的国家和价值观,并尝试对其有所了解。 +100到countrycode包,以获得足够的正则表达式以理解大多数国家/地区名称。 注意:它并不能完全捕捉到它们,因此您需要进行一些自己的数据转换。

它还从我们shapefile中的国家/地区抓取质心,但是你可能也想要更改其中的几个(因为 - 举个例子 - 我想你会想要低于48个州的地理美国中心而不是整个中心。)

# Transform our country data ----------------------------------------------

proportions <- "Japan 3137 China 542 Korea 499 VietNam 423 Indonesia 261 Thailand 222 SriLanka 60 Taiwan 56 Taiwan 60 Bangladesh 51 Nepal 43 India 37 Mongolia 26 Myanmar 21 Philippines 16 Singapore 15 Cambodia 11 Malaysia 10 Pakistan 9 Lao_People_Democratic_Republic 7 Brunei_Darussalam 3 Afghanistan 10 Iran 2 Yemen 2 United_Arab_Emirates 2 Lebanon 1 Israel 1 Kenya 9 Botswana 7 Ethiopia 3 Nigeria 2 Mozambique 2 Uganda 2 Morocco 1 Ghana 1 South_Africa 1 Zimbabwe 1 America 58 Canada 5 UnitedMexicanStates 5 Brazil 2 Guyana 2 AntiguaandBarbuda 1 Cuba 1 Nicaragua 1 Fiji 11 Australia 6 Tonga 6 Samoa 2 PapuaNewGuinea 1 Uzbekistan 106 Norway 10 KyrgyzRepublic 9 Germany 7 Fracne 6 Tajikistan 6 Austria 5 Italy 5 UK 5 Belgium 4 Denmark 4 Sweden 4 Finland 4 Estonia 3 Lithuania 3 Russia 3 Georgia 1 Netherlands 1 Portuguese 1 Iceland 1 Kazakhstan 1 Moldova 1 Poland 1 Spain 1 SwissConfedeartion 1 Ukraine 1"

proportions %>%
  strsplit(" ") %>%
  extract2(1) %>%
  matrix(ncol=2, byrow=TRUE) %>%
  as.data.frame(stringsAsFactors=FALSE) %>%
  select(country=1, value=2) %>%
  mutate(value=as.numeric(value),
         iso_2c=countrycode(country, "country.name", "iso2c")) %>%
  left_join(data.frame(gCentroid(world, byid=TRUE), iso_2c=world@data$iso_a2)) -> pts

然后,最后一位代码绘制地图上的地图和点。它没有使用国家的颜色,因为你的观众不太可能分辨出76+色调中的许多颜色之间的相似性的细微差别。如果您确实需要基于“家庭”的颜色(来自您的图片示例),您需要确定哪些国家属于哪个“家庭”,然后根据该新因素进行着色。地图代码也使用log比例尺(基于value),因为这似乎更有意义。

gg <- ggplot()
gg <- gg + geom_map(map=world_map, data=world_map,
                    aes(map_id=id, x=long, y=lat))
gg <- gg + geom_point(data=pts, aes(x=x, y=y, size=log(value)), color="red")
gg <- gg + scale_x_continuous(expand=c(0,0))
gg <- gg + scale_y_continuous(expand=c(0,0))
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_equal()
gg <- gg + theme_bw()
gg <- gg + theme(panel.border=element_blank())
gg

enter image description here

我故意留下许多ggplot2默认值并使用了可怕的红色,因此您必须更改它们以满足您的出版需求。