查看原文
其他

R语言与地图(二)

2017-01-22 刘洋 R语言中文社区

Hello,

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

        本周,我们将讲解如何利用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)

  )


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


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. 谢谢您的收听,咱们下期再见,再见,再见~



ecnu刘洋,天善智能社区专家,公众号:一点儿数据分析

Blog:



微信回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存