Построение карты мира в 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())