我想使用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")
我不知道该怎么办。
答案 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
我故意留下许多ggplot2
默认值并使用了可怕的红色,因此您必须更改它们以满足您的出版需求。