我试图根据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)才能真正看到它。
答案 0 :(得分:5)
所以,正如我之前提到的,你只能拥有每个属性的比例。因此,即使您将填充颜色添加为单独的图层,也不会为每个国家/地区重置填充颜色。为了执行这样的着色,您需要创建自己的变量,以这种方式运行。我使用interaction()
来查找国家/种族的独特组合。然后,我拿了这些值并将它们映射到1:12。我用
greg$ceid <- (as.numeric(interaction(greg$G1ID, greg$FIPS_CNTRY, drop=T)) %% 12) +1
现在假设FIPS_CNTRY
比COW
更能衡量国家/地区。对于特定种族,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定性颜色托盘。看起来像这样
如果您使用默认颜色绘制第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")
后一个情节肯定会更顺畅&#34;但是你想要通过情节进行沟通真的取决于你。