2014-03-25 4 views
2

Я читал так много нитей и статей, и я продолжаю получать ошибки. Я пытаюсь сделать choropleth? карту мира, используя данные, которые я имею в базе данных глобального терроризма. Я хочу покрасить страны с коэффициентом nkills или просто количество атак в этой стране. На данный момент меня это не волнует. Поскольку существует так много стран с данными, необоснованно делать какие-либо сюжеты для отображения этих данных.Карта мира Choropleth

Помощь очень ценится, и если я не спрашиваю об этом правильно, я искренне извиняюсь, я изучаю правила этого веб-сайта, когда я иду.

мой код (до сих пор ..)

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 с радостью за помощь.

+0

Можно ли поставить вас в GTD data.frame, например, через Dropbox? Возможно, тогда вы получите более подходящий ответ. – fdetsch

+0

Я честно не знаю как. Он доступен в Интернете, хотя, где я его загрузил. – hk47

+0

Хорошо, это хорошо для начала. Тогда, возможно, вы могли бы просто скопировать ссылку для загрузки и опубликовать ее здесь ;-) – fdetsch

ответ

4

Основываясь на приятной работе @jlhoward. Вместо этого вы можете использовать rworldmap, который уже имеет карту мира в R и имеет функции, помогающие объединить данные с картой. Карта по умолчанию имеет намеренно низкое разрешение, чтобы создать «более чистый» вид.Карта может быть настроена (см 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) 

После комментария от @ HK-47, вы можете также добавить точки на карту размером с количеством жертв ,

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

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

+0

Это абсолютно идеально! Я пытаюсь добавить точки долготы/широты, чтобы показать, где в странах произошли атаки (т. Е. Сосредоточены в небольших районах). Проблема заключается в том, что я добавляю смертность <- подмножество (x = gtd, nkill> 0) точек (смертность $ долготы, смертность $ широта, col = "синий", cex = .5) точки будут отображаться на карте, но я не думайте, что сама карта отформатирована по широте/долготе, потому что точки не выстраиваются правильно, и если бы я должен был отрегулировать окно, чтобы увеличить карту, точки не останутся в нужном месте, как если бы они использовали библиотека (карты), карта() с точками – hk47

+0

@ hk47 Спасибо. Хорошая идея с очками. Когда я это сделал, они правильно выстроились правильно, однако вы правы, когда я масштабировал окно карты, точки и границы страны двигались по-другому. С головы до ног я не знаю, почему это (кто?), И сейчас уже поздно, я буду думать завтра. Вы также можете использовать mapBubbles для добавления пузырьков, размер которых зависит от данных, я отредактирую ответ, чтобы добавить это. – Andy

8

Что-то вроде этого? Это решение с использованием rgdal и ggplot. Я давно отказался от использования базы 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 <- [email protected] 
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="") 

Есть несколько версий базы данных глобального терроризма. Я использовал полный набор данных here, а затем подмножество на год> 2009 год. Таким образом, эта карта показывает полную смертность из-за терроризма по странам с 2010-01-01 по 2013-01-01 (последние данные из этого источника) , Файлы доступны в виде загрузки MS Excel, которые я преобразовал в csv для импорта в R.

world map доступен как файл формы из GeoCommons website.

Трудная часть создания choropleth-карт связывает ваши данные с правильными многоугольниками (странами). Обычно это четырехэтапный процесс:

  1. Найти поле в таблице атрибутов шейп-файла, которая отображает (не соответствует каламбуру) в соответствующее поле в ваших данных. В этом случае кажется, что поле «CNTRY_NAME» в файле формы отображается в поле «country_txt» в базе данных gtd.
  2. Создайте связь между идентификаторами ploygon (хранимыми в именах строк таблицы атрибутов) и поле CNTRY_NAME.
  3. Объедините результат с вашими данными с помощью CNTRY_NAME и country_txt.
  4. Объединить результат с фреймом данных, созданным с помощью fortify(map) - это связывает уловки со смертью (nkill).
+0

ДА! Это именно то, что я пытался сделать буквально в течение нескольких часов. Я действительно очень ценю вашу работу и терпение. – hk47

+0

Я добавил немного объяснений. Довольно мрачные вещи. – jlhoward

+0

BTW, соглашение о SO должно подождать 24 часа, прежде чем принимать ответ. Таким образом, вы можете получить другие ответы, которые вам больше нравятся. Как только вы примете, большинство людей пропустит это. (Вы можете подняться, хотя ...). – jlhoward

Смежные вопросы