ggplot保留组合图的重复颜色

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)才能真正看到它.

MrF*_*ick 5

所以,正如我之前提到的,你只能拥有每个属性的比例.因此,即使您将填充颜色添加为单独的图层,也不会为每个国家/地区重置填充颜色.为了执行这样的着色,您需要创建自己的变量,以这种方式运行.我所做的是用来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)

在此输入图像描述

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