我正在尝试使用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
所有国家/地区的数据?我怎么能超越那个?
编辑:我想要的是绘制整个地图。 (我的描述中我不清楚)
答案 0 :(得分:9)
你也可以在&#34;层中工作&#34;正如其他GIS环境所允许的那样(也可以让你不合并数据)。这可以通过多种方式实现,但我喜欢使用geom_map
:
library(ggplot2)
library(dplyr)
WorldData <- map_data('world') %>% filter(region != "Antarctica") %>% fortify
df <- data.frame(region=c('Hungary','Lithuania','Argentina'),
value=c(4,10,11),
stringsAsFactors=FALSE)
p <- ggplot() +
geom_map(data = WorldData, map = WorldData,
aes(x = long, y = lat, group = group, map_id=region),
fill = "white", colour = "#7f7f7f", size=0.5) +
geom_map(data = df, map=WorldData,
aes(fill=value, map_id=region),
colour="#7f7f7f", size=0.5) +
coord_map("rectangular", lat0=0, xlim=c(-180,180), ylim=c(-60, 90)) +
scale_fill_continuous(low="thistle2", high="darkred", guide="colorbar") +
scale_y_continuous(breaks=c()) +
scale_x_continuous(breaks=c()) +
labs(fill="legend", title="Title", x="", y="") +
theme_bw()
p
这也有一个投射(通过coord_map
),这样你就可以得到一致的输出并摆脱南极洲。
答案 1 :(得分:3)
问题是每个多边形中点的排序。 WorldData
中的点需要按顺序绘制(部分由order
列表示,merge
不保留此顺序。您可以通过添加以下行来解决此问题:< / p>
Total <- Total[order(Total$order), ]
在您的绘图之前,对Total
数据框进行排序,以便order
列升序。
答案 2 :(得分:2)
这是因为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())