ggplot保留组合图的重复颜色

时间:2014-08-24 21:26:26

标签: r plot ggplot2 geospatial

我试图根据SpatialPolygonsDataFrame创建一张世界上所有种族的地图(形状文件可以下载here)。我的问题是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")   

然而,当我在循环和大量多边形(在这种情况下是国家)中运行此代码时,许多多边形的颜色(查看意大利和瑞士)变得难以区分,因为ggplot分配了一种独特的颜色到每一个(显然有6011个多边形)。有没有办法保持&#34;非独特&#34;组合图中每个多边形的颜色?换句话说,绘图应该允许重复的颜色。

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") 

PS:您可能必须导出第二个图(即。到PNG)才能真正看到它。

1 个答案:

答案 0 :(得分:5)

所以,正如我之前提到的,你只能拥有每个属性的比例。因此,即使您将填充颜色添加为单独的图层,也不会为每个国家/地区重置填充颜色。为了执行这样的着色,您需要创建自己的变量,以这种方式运行。我使用interaction()来查找国家/种族的独特组合。然后,我拿了这些值并将它们映射到1:12。我用

做到了
greg$ceid <- (as.numeric(interaction(greg$G1ID, greg$FIPS_CNTRY, drop=T)) %% 12) +1

现在假设FIPS_CNTRYCOW更能衡量国家/地区。对于特定种族,G1ID似乎比整个数据集中的GROUP1更好。如果有此数据集的文档,您可能需要仔细阅读它以验证此信息。大多数国家的种族少于10个,但有一个国家有206个,其次是87个。

所以这试图在各个国家分散颜色。下一个技巧是明确使用fortify来告诉ggplot如何对区域进行分组。我们这样做

fortify(greg, region="ceid")

产生类似

的东西
       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

其中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") 

这里我使用了colorbrewer定性颜色托盘。看起来像这样

enter image description here

如果您使用默认颜色绘制第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") 

enter image description here

后一个情节肯定会更顺畅&#34;但是你想要通过情节进行沟通真的取决于你。