2

我已经阅读了很多主题和文章,但我不断收到错误。我正在尝试做一个等值线?使用我从全球恐怖主义数据库中获得的数据绘制的世界地图。我想根据 nkills 或该国家/地区的攻击次数来为国家着色。我现在不在乎。因为有这么多的国家有数据,所以做任何图表来展示这些数据是不合理的。

非常感谢您的帮助,如果我没有正确地提出这个问题,我真诚地道歉,我正在学习这个网站的规则。

我的代码(到目前为止..)

library(maps)
library(ggplot2)
map("world")
world<- map_data("world")
gtd<- data.frame(gtd)
names(gtd)<- tolower(names(gtd))
gtd$country_txt<- tolower(rownames(gtd))
demo<- merge(world, gts, sort=FALSE, by="country_txt")

在 gtd 数据框中,国家列的名称是“country_txt”,所以我想我会使用它,但在 fix.by(by.x, x) 中出现错误:'by' 必须指定唯一有效的列

如果那行得通,我会像在几个网站上看到的那样进行绘图。老实说,我已经为此工作了很长时间,并且阅读了很多代码/其他类似问题/网站/r手册等。我会接受我在 R 方面的无能很高兴寻求帮助。

4

2 回答 2

8

像这样的东西?这是一个使用rgdaland的解决方案ggplot。我很久以前就放弃了使用 base R 来处理这类事情。

library(rgdal)        # for readOGR(...)
library(RColorBrewer) # for brewer.pal(...)
library(ggplot2)
setwd(" < directory with all files >")

gtd        <- read.csv("globalterrorismdb_1213dist.csv")
gtd.recent <- gtd[gtd$iyear>2009,]
gtd.recent <- aggregate(nkill~country_txt,gtd.recent,sum)
world      <- readOGR(dsn=".",
                      layer="world_country_admin_boundary_shapefile_with_fips_codes")

countries <- world@data
countries <- cbind(id=rownames(countries),countries)
countries <- merge(countries,gtd.recent, 
                   by.x="CNTRY_NAME", by.y="country_txt", all.x=T)
map.df <- fortify(world)
map.df <- merge(map.df,countries, by="id")
ggplot(map.df, aes(x=long,y=lat,group=group)) +
  geom_polygon(aes(fill=nkill))+
  geom_path(colour="grey50")+
  scale_fill_gradientn(name="Deaths",
                       colours=rev(brewer.pal(9,"Spectral")),
                       na.value="white")+
  coord_fixed()+labs(x="",y="")

全球恐怖主义数据库有多个版本。我使用了此处可用的完整数据集,然后对 > 2009 年进行了子集化。因此,这张地图按国家/地区显示了从 2010 年 1 月 1 日到 2013 年 1 月 1 日的总死亡人数(此来源提供的最后数据) . 这些文件可作为 MS Excel 下载获得,我将其转换为 csv 以导入 R。

世界地图可从GeoCommons 网站以 shapefile 形式获得。

制作等值线图的棘手部分是将您的数据与正确的多边形(国家)相关联。这通常是一个四步过程:

  1. 在 shapefile 属性表中查找映射(没有双关语)到数据中相应字段的字段。在这种情况下,shapefile 中的字段“CNTRY_NAME”似乎映射到 gtd 数据库中的字段“country_txt”。
  2. 在 ploygon ID(存储在属性表的行名中)和 CNTRY_NAME 字段之间创建关联。
  3. 使用 CNTRY_NAME 和 country_txt 将结果与您的数据合并。
  4. fortify(map)将结果与使用- 这将多边形与死亡 ( )创建的数据框合并nkill
于 2014-03-25T05:31:38.410 回答
4

以@jlhoward 的出色工作为基础。您可以改为使用rworldmapR 中已有的世界地图,并具有帮助将数据连接到地图的功能。默认地图故意低分辨率以创建“更清洁”的外观。可以自定义地图(请参阅rworldmap文档),但这是一个开始:

library(rworldmap)

#3 lines from @jlhoward 
gtd        <- read.csv("globalterrorismdb_1213dist.csv")
gtd.recent <- gtd[gtd$iyear>2009,]
gtd.recent <- aggregate(nkill~country_txt,gtd.recent,sum)

#join data to a map
gtdMap <- joinCountryData2Map( gtd.recent, 
                               nameJoinColumn="country_txt", 
                               joinCode="NAME" )

mapDevice('x11') #create a world shaped window

#plot the map
mapCountryData( gtdMap, 
                nameColumnToPlot='nkill', 
                catMethod='fixedWidth', 
                numCats=100 )

根据@hk47 的评论,您还可以将点添加到按伤亡人数大小的地图上。

deaths <- subset(x=gtd, nkill >0)

mapBubbles(deaths,
           nameX='longitude',
           nameY='latitude', 
           nameZSize='nkill', 
           nameZColour='black',
           fill=FALSE, 
           addLegend=FALSE, 
           add=TRUE)

于 2014-03-25T10:00:35.860 回答