Построение карты мира в R

Я пытаюсь визуализировать некоторые данные из стран на карте мира, используя R и ggplot2, Я использую следующий код (образец):

WorldData <- map_data('world')
df <-data.frame(region=c('Hungary','Lithuania','Argentina'),value=c(4,10,11))
Total <- merge(WorldData,df,by='region')

и для построения с использованием ggplot:

p <- ggplot()
p <- p + geom_polygon(data=Total, aes(x=long, y=lat, group = group,fill=Total$value),colour="white") + 
         scale_fill_continuous(low = "thistle2", high = "darkred", guide="colorbar")
P1 <- p + theme_bw()  + labs(fill = "legend" ,title = "Title", x="", y="")
P1 + scale_y_continuous(breaks=c()) + scale_x_continuous(breaks=c()) + theme(panel.border =  element_blank())

Выход такой:

введите описание изображения здесь

Я считаю, что проблема в merge потому что, когда я меняю опцию данных в geom_polygon в WorldData и fill возможность 1 У меня есть следующий результат:введите описание изображения здесь

Это происходит потому, что у меня нет данных по всем странам df? Как я могу обогнать это?

редактировать: то, что я хотел бы, чтобы построить всю карту.(Я не был понятен в моем описании)

3 ответа

Решение

Вы также можете работать в "слоях", как позволяют вам другие ГИС-среды (что также позволит вам не объединять данные). Это может быть достигнуто разными способами, но мне нравится использовать geom_map:

library(ggplot2)
library(dplyr)

WorldData <- map_data('world')
WorldData %>% filter(region != "Antarctica") -> WorldData
WorldData <- fortify(WorldData)

df <- data.frame(region=c('Hungary','Lithuania','Argentina'), 
                 value=c(4,10,11), 
                 stringsAsFactors=FALSE)

p <- ggplot()
p <- p + geom_map(data=WorldData, map=WorldData,
                  aes(x=long, y=lat, group=group, map_id=region),
                  fill="white", colour="#7f7f7f", size=0.5)
p <- p + geom_map(data=df, map=WorldData,
                  aes(fill=value, map_id=region),
                  colour="#7f7f7f", size=0.5)
p <- p + coord_map("rectangular", lat0=0, xlim=c(-180,180), ylim=c(-60, 90))
p <- p + scale_fill_continuous(low="thistle2", high="darkred", 
                               guide="colorbar")
p <- p + scale_y_continuous(breaks=c())
p <- p + scale_x_continuous(breaks=c())
p <- p + labs(fill="legend", title="Title", x="", y="")
p <- p + theme_bw()
p <- p + theme(panel.border = element_blank())
p 

Это также имеет прогноз (через coord_map), так что вы получите последовательный выход и избавится от Антарктиды.

Проблема заключается в упорядочении точек в каждом многоугольнике. Точки в WorldData должны быть нарисованы в порядке (который частично представлен order столбец и merge не сохраняет этот порядок. Вы можете исправить это, добавив строку:

Total <- Total[order(Total$order), ]

перед вашим сюжетом, который сортирует Total фрейм данных, так что order столбец по возрастанию.

Это происходит потому, что merge() сортирует данные до того, как произойдет объединение, но для правильного построения многоугольника необходимо сохранить порядок исходных данных карты.

Вместо слияния попробуйте сконструировать фрейм данных следующим образом:

Total <- WorldData[WorldData$region %in% df$region, ]
Total$value <- df$value[match(Total$region, df$region)]

Полный код:

library(ggplot2)
library(maps)

WorldData <- map_data('world')
head(WorldData, 100)
df <-data.frame(region=c('Hungary','Lithuania','Argentina'),value=c(4,10,11))

Total <- WorldData[WorldData$region %in% df$region, ]
Total$value <- df$value[match(Total$region, df$region)]

ggplot(Total, aes(x=long, y=lat, group = group, fill = value)) + 
  geom_polygon(colour = "white") +
  scale_fill_continuous(low = "thistle2", 
                        high = "darkred", 
                        guide="colorbar") +
  theme_bw()  + 
  labs(fill = "legend" ,title = "Title", x="", y="") +
  scale_y_continuous(breaks=c()) + 
  scale_x_continuous(breaks=c()) + 
  theme(panel.border =  element_blank())

Другие вопросы по тегам