gpt4 book ai didi

r - ggplot 保留组合图的重复颜色

转载 作者:行者123 更新时间:2023-12-01 11:37:55 33 4
gpt4 key购买 nike

我正在尝试基于 SpatialPolygonsDataFrame 创建世界上所有种族的 map (可以下载形状文件 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 个多边形)。有没有办法在组合图中保留每个多边形的“非唯一”颜色?换句话说,情节应该允许重复的颜色。

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

最佳答案

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

后一个情节当然“更流畅”,但你想通过情节传达什么完全取决于你。

关于r - ggplot 保留组合图的重复颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476469/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com