使用R为shapefile中的多边形指定特定颜色

时间:2014-11-13 17:48:46

标签: r colors shapefile

我正在比较弗吉尼亚州2010年和2014年中期选举的结果。我这样做是通过在弗吉尼亚州的地图上使用弗吉尼亚国会区的文件。我想为那些选出共和党候选人的地区上色,并选出民主党选中蓝色的地区。 项目还有更多内容,但一旦我弄清楚如何做到这一点,我将能够弄清楚如何进行项目的其余部分。

我正在使用此处找到的文件:

http://www.arcgis.com/home/item.html?id=dc20260d27654c64bfa0c2979a317597

这是我用来绘制shapefile的代码:

library(maptools)
library(shapefiles)

CCBound <- readShapePoly("tl_rd13_51_cd113")
CCBound2 <- CCBound

system.time(plot(CCBound2))

这给了我一张很好的弗吉尼亚州地图,其中列出了十个国会选区。

如上所述,我应该如何在各区进行着色?

2 个答案:

答案 0 :(得分:1)

CCBound对象是SpatialPolygonsDataFrame。基本上,它是一个多边形列表加上data.frame,其行数与多边形数一样多,它给出了每个多边形的一些信息。您可以查看data.frame至:

    CCBound@data

从中我们了解到有11个地区。从那里,你可以建立一个颜色矢量,其中redblue值取决于谁赢得了区。向量中的值必须与CCbound@data中的区域的顺序相同。构建此向量后,可以使用plot参数调用col函数。如果cols是颜色矢量,您可以尝试:

    plot(CCBound,col=cols)

答案 1 :(得分:1)

这是一个ggplot解决方案。你似乎要求一个基本的R方法,但IMO值得学习ggplot以增加灵活性。这应该可以帮到你。

我必须对您的数据格式做出一些假设,因为您没有提供它。下面的代码仅显示了此示例中数据的组织方式

# 2010 and 2014 Congressional Election results in Virginia. 
data.2010 <- data.frame(district=sprintf("%02i",1:11),
                   R=c(63.9,53.1,27.2,62.3,50.8,76.3,59.2,37.3,51.2,62.9,48.8),
                   D=c(34.8,42.4,70.0,37.5,47.0,00.0,34.1,61.0,46.4,34.8,49.2))
data.2014 <- data.frame(district=sprintf("%02i",1:11),
                   R=c(63.0,57.9,000.0,60.3,61.0,75.5,60.9,31.7,74.9,56.6,40.4),
                   D=c(34.5,42.1,100.0,37.5,35.8,00.0,36.9,63.0,00.0,40.4,56.9))
data <- cbind(year=rep(c(2010,2014),each=11),rbind(data.2010,data.2014))
data$delta <- with(data,D-R)
head(data)
#   year district    R    D delta
# 1 2010       01 63.9 34.8 -29.1
# 2 2010       02 53.1 42.4 -10.7
# 3 2010       03 27.2 70.0  42.8
# 4 2010       04 62.3 37.5 -24.8
# 5 2010       05 50.8 47.0  -3.8
# 6 2010       06 76.3  0.0 -76.3

绘制地图。

library(ggplot2)
library(rgdal)
setwd("c:/users/jlh/desktop/map/virginia.congressional.districts")
map <- readOGR(dsn=".",layer="tl_rd13_51_cd113")
map.data <- data.frame(id=rownames(map@data),district=map@data$CD113FP)
map.data <- merge(map.data,data)
map.df   <- fortify(map)
map.df   <- merge(map.df,map.data)
ggplot(map.df,aes(x=long,y=lat,group=group))+
  geom_polygon(aes(fill=delta),color="grey20")+
  facet_wrap(~year,nr=2)+
  scale_fill_gradient2(low="red",high="blue",mid="white",limits=c(-100,100))+
  coord_map()+labs(x="",y="")+
  theme_bw()+
  theme(panel.grid=element_blank(),
        panel.border=element_blank(),
        axis.text=element_blank(),
        axis.ticks=element_blank())

enter image description here

请注意,在2014年的第三区,民主党人无人反对,而第六和第九区则受到质疑,但没有民主党人参选。

帖子herehere说明了工作流程。