R语言与地图(二)

浏览: 2095

Hello,

        大家好!欢迎收听 每周五分钟 与大家分享 一点儿数据分析 的那些事。

        昨天美国大选结束,特朗普当选美国第58届总统,A股的川大智胜异动了,加拿大的移民局被挤爆了。。。Okay,言归正传,本周,我们将讲解如何利用maptools包和ggplot2包来绘制美国的大选地图。

        1.获取美国各州的信息:

setwd('一点儿数据分析20161110')    #设置工作目录

lapply(c('maptools','ggplot2','plyr','grid'), function(xx) library(xx, character.only = TRUE))   # 载入包

American_map <-readShapePoly("STATES.SHP")    # 读取美国各州的边界信息

American_map1 <- fortify(American_map)     # 转化为数据框(经纬度)

x <- American_map@data    # 读取行政信息(各州名称)

xs <- data.frame(x,id=0:50)    # 行代表50个州和哥伦比亚特区

American_map_data <- join(American_map1, xs, by='id', type = "full")    # 合并两个数据框(各州名称和边界信息)


        2.读取投票信息:

vote <- read.csv("votes.csv",header = T)

data <- join(American_map_data, vote, by='STATE_NAME', type="left")     # 按州名合并两个数据框

data$Candidate<-ifelse(data$VOTES==1,'Hillary',ifelse(data$VOTES==2,'Trump','Unkown'))    # 定义各州获胜的候选人


        3.利用ggplot2包绘制美国大选地图:

ggplot(data, aes(x = long, y = lat,group=group,fill= Candidate)) + 

  scale_fill_manual(values=c("darkblue", "red", "yellow"), labels=c("Hillary", "Trump", "Unkown")) + 

  geom_polygon(colour="grey40") + 

  theme(            

    panel.grid = element_blank(),

    panel.background = element_blank(),

    axis.text = element_blank(),

    axis.ticks = element_blank(),    

    axis.title = element_blank(),

    legend.position = c(0.2,0.4)

  )


        结果如下图所示,发现地图是按照原地理位置放缩的,并不美观。因此我们尝试以下改进。

QQ截图20161130100858.png

        4. 图层的叠加:

data1 <- data[data$STATE_NAME!='Alaska'&data$STATE_NAME!='Hawaii',]

data2 <- data[data$STATE_NAME=='Hawaii',]

data3 <- data[data$STATE_NAME=='Alaska',]    # 定义数据集

g1 <- ggplot(data1, aes(x = long, y = lat,group=group,fill= Candidate)) +

  scale_fill_manual(values=c("darkblue", "red", "yellow"), labels=c("Hillary", "Trump", "Unkown")) +

  geom_polygon(colour="white") +

  coord_map("polyconic") +       # 指定投影方式,获得常见视角美国地图,如要获得平面视角地图,此句可省略

  theme(              

    panel.grid = element_blank(),

    panel.background = element_blank(),

    axis.text = element_blank(),

    axis.ticks = element_blank(),

    axis.title = element_blank(),

    legend.position = c(0.2,0.6)

  ) + xlim( min(data1$long)-20, max(data1$long))

g2 <- ggplot(data2, aes(x = long, y = lat,group=group,fill=Candidate)) +

  scale_fill_manual(values=c("darkblue"), labels=c("Hillary")) +

  geom_polygon(colour="white") +

  coord_map("polyconic") +      

  theme(              

    panel.grid = element_blank(),

    panel.background = element_blank(),

    axis.text = element_blank(),

    axis.ticks = element_blank(),

    axis.title = element_blank(),

    plot.background=element_rect(I(0),linetype=0)

  )+guides(fill=FALSE) 

g3 <- ggplot(data3, aes(x = long, y = lat,group=group,fill=Candidate)) +

  scale_fill_manual(values=c("red"), labels=c("Trump"))+

  geom_polygon(colour="white") +

  coord_map("polyconic") +    

  theme(              

    panel.grid = element_blank(),

    panel.background = element_blank(),

    axis.text = element_blank(),

    axis.ticks = element_blank(),

    axis.title = element_blank(),

    plot.background=element_rect(I(0),linetype=0)

  ) + guides(fill=FALSE)   

g1 + labs(title = "American Presidential Election") +

  theme(plot.title = element_text(size=16,colour = "red",face = "bold"))    # 画底图(大陆)

vs <- viewport(width=0.15,height=0.15,x=0.4,y=0.32)     # 指定视窗大小

print(g2,vp=vs)    # 将g2 叠加到上图中

vs <- viewport(width=0.35,height=0.35,x=0.25,y=0.34)   

print(g3,vp=vs)    


        结果见下图:


        是的,没错,这是不是和竞选过程中凤凰网绘制的美国大选地图很像呢。如果可以,我们还可以将两人在各州赢得的选票百分比通过各州颜色的深浅反应出来,在一定程度上能说明各州竞选的激烈程度。

        5. 数据百度云:

        链接: https://pan.baidu.com/s/1gf1DoyR 密码: cbki


        Okay, that's all. 谢谢您的收听,咱们下期再见,再见,再见~

如有兴趣,可以关注一下微信公众号:


推荐 3
本文由 ecnu刘洋 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册