jcf*_*rei 3 plot r geospatial ggplot2
我正在尝试创建一个世界上所有种族的地图 - 基于SpatialPolygonsDataFrame(形状文件可以在这里下载).我的问题是ggplot每次连续调用后都会重新分配颜色geom_polygon.以下两个国家的代码运作良好,所有区域/种族可以相互区分.
library(rgeos)
library(maptools)
library(rms)
library(igraph)
library(foreign)
library(sp)
library(spdep)
library(ggplot2)
setwd("yourdirectory")
# load GREG dataset
greg <- readShapePoly("GREG.shp", proj4string=CRS("+proj=longlat +datum=WGS84"))
# exclude very small polygons (<= 5 square km)
greg <- greg[greg$AREA > 1000e+06,]
dev.off()
temp <- greg[greg$COW==325,]
g<-ggplot(temp, aes(x = long, y = lat)) +
geom_polygon(data=temp,aes(group = group, fill=group, size=1))
temp <- greg[greg$COW==225,]
g +
geom_polygon(data=temp,aes(group = group, fill=group, size=1)) +
theme(legend.position = "none")
Run Code Online (Sandbox Code Playgroud)
然而,当我在一个循环和大量多边形(在这种情况下是国家)中运行此代码时,许多多边形(检查意大利和瑞士)的颜色变得难以区分,因为ggplot为每个多边形分配了一种独特的颜色(显然有6011个多边形).有没有办法在组合图中保持每个多边形的"非唯一"颜色?换句话说,绘图应该允许重复的颜色.
dev.off()
temp <- greg[greg$COW==0,]
g <- ggplot(temp, aes(x = long, y = lat)) +
geom_polygon(data=temp,aes(group = group, fill=group, size=1))
for (cow in unique(greg$COW)) {
if (cow==0) next
temp <- greg[greg$COW==cow,]
g <- g +
geom_polygon(data=temp, aes(group = group, fill=group, size=1))
}
g <- g + theme(legend.position = "none")
Run Code Online (Sandbox Code Playgroud)
PS:您可能必须导出第二个图(即到PNG)才能真正看到它.
所以,正如我之前提到的,你只能拥有每个属性的比例.因此,即使您将填充颜色添加为单独的图层,也不会为每个国家/地区重置填充颜色.为了执行这样的着色,您需要创建自己的变量,以这种方式运行.我所做的是用来interaction()找到国家/种族的独特组合.然后,我拿了这些值并将它们映射到1:12.我这样做了
greg$ceid <- (as.numeric(interaction(greg$G1ID, greg$FIPS_CNTRY, drop=T)) %% 12) +1
Run Code Online (Sandbox Code Playgroud)
现在假设这FIPS_CNTRY是一个比国家更好的衡量标准COW.G1ID对于特定种族而言GROUP1,它似乎也是比数据集更好的ID .如果有此数据集的文档,您可能需要仔细阅读它以验证此信息.大多数国家的人口少于10个,但有一个国家有206个,其次是87个.
所以这试图在各个国家分散颜色.下一个技巧是fortify明确地使用告诉ggplot如何对区域进行分组.我们这样做
fortify(greg, region="ceid")
Run Code Online (Sandbox Code Playgroud)
它产生的东西看起来像
long lat order hole piece group id
1 -158.7752 63.22207 1 FALSE 1 1.1 1
2 -158.7752 63.36345 2 FALSE 1 1.1 1
3 -158.4783 63.54724 3 FALSE 1 1.1 1
4 -158.4359 63.64621 4 FALSE 1 1.1 1
5 -158.3228 63.83000 5 FALSE 1 1.1 1
6 -158.0262 63.98471 6 FALSE 1 1.1 1
Run Code Online (Sandbox Code Playgroud)
其中,group表示多边形分组,id对应于我们在中指定的区域fortify.所以这些是1:12的数字.现在我们用这个全部绘制
g <- ggplot(fortify(greg, region="ceid"), aes(x = long, y = lat)) +
geom_polygon(aes(group = group, fill = id), size=1) +
scale_fill_brewer(type="qual", palette = "Set3") +
theme(legend.position = "none")
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了colorbrewer定性颜色托盘.看起来像这样

如果您使用默认颜色绘制第1组的实际种族ID,则可以获得
g <- ggplot(fortify(greg, region="G1ID"), aes(x = long, y = lat)) +
geom_polygon(aes(group = group, fill=id), size=1) +
theme(legend.position = "none")
Run Code Online (Sandbox Code Playgroud)

后一个情节肯定是"更平滑",但是你想要通过情节进行沟通,这取决于你.