可视化:中国地图R/ggplot2
实际工作中,很多时候有画地图的需求,只要一出现就是全ppt最靓的图了。这里介绍一下如何在R中用ggplot2画出好看的中国地图,是很多年前写的代码了,运行了一下发现还没有过时。下一篇介绍在python中如何画。
如果不想写代码,可以搜索“地图慧“,在线制作相关地图。如果有一定的基础,还是建议自己实现。因为自己做的可以更好看,更灵活,如果想要本文源代码,后台回复“地图”,可以得到本文源码和相关辅助数据。闲话不多说,撸起袖子加油干。一共就两步:
-
准备数据
-
画地图
准备数据阶段,我们需要国家地理信息,如果是不同的省都有各自的文件,我们这里采用全国的数据。然后就是我们自己的数据,自己的数据如果只有省份或城市,还需要一个辅助数据关联起省市与地图数据,即各个省市的经纬度。如果我们自己的数据已经自带经纬度,就省点力气了。
这三个就是我们必须的地理信息文件了
我们的数据长这个样子,其实关键的就是 City这一列,和Total Year这一列。业务意义是每个城市一整年的销量。奇奇怪怪的数据可能是某种高达模型吧。
还需要的一个辅助数据,需要知道上面各个城市的经纬度。注意这里的City名字要和上面的数据对应起来,否则无法找到该城市的位置的画,无法画出那个位置了。
这样准备工作就做好啦,开始第二步画图。
画图就比较简单,首先读取地图数据
#Import the map data
province<-readShapePoly("../../assets/province.shp")
chinamap<-fortify(province)
provincedata<-data.frame(aaa@qq.com,id=seq(0:924)-1)
china_mapdata<-join(chinamap,provincedata, type = "full")
然后读取我们的数据和辅助数据,并对齐
#import the data
Data<-as.data.frame(read.csv("../../data/map_R_province.csv",sep=';',header=T))
#aggregrate
Data_agg<-ddply(Data,.(City),summarize,Complaints_value=length(City))
City_code<-read.table("../../assets/city_geocode_lookup.csv", sep=';', header=T)
Da<-merge(Data_agg,City_code,by.x='City',by.y='City')
然后就开始画图了,优雅的ggplot,并保存图片。
这里可以详细说一下,帮助大家实现自定义更改。
geom_path 部分就是地图的各个省分界线。
geom_polygon 部分就是整个地图的灰色背景
geom_point就是我们自己数据里对应的销量
annotate就是我的名字YueTan了
#plot
p1<-ggplot(data = chinamap) + geom_path(aes(x = long, y = lat, group = id),size=0.2, colour="black")+coord_map()+ ylim(14,55)
p1<-p1 + geom_polygon(aes(x=long,y=lat,group=id),fill = 'grey90',size=0.1, alpha=0.4)
p1<-p1 + geom_point(data=Da, aes(x=Lon, y=Lat, size=Complaints_value),color='red',alpha=0.45)+scale_size(range = c(0,4))
p1<-p1 + annotate("text",x = 84,y =20, label = "YueTan",family = "serif", fontface = "italic", colour = "black", size = 4)
theme_map <- list(theme(panel.grid.minor = element_blank(),
panel.grid.major = element_blank(),
panel.border = element_blank(),
axis.line = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.background = element_rect(fill="transparent"),
plot.background = element_rect(fill = "transparent"),
legend.background = element_rect(fill = "transparent"),
legend.box.background = element_rect(fill = "transparent")))
p1<-p1+theme_map+ggtitle('Welcome to follow')+theme(plot.title = element_text(family = 'Helvetica',face = "bold"))
ggsave("../../assets/images/China map bubble plot.png", p1, height=4.8, width=9.5)
然后得到的效果就是:
这里是模仿飞机航线,从高达的产地亦庄,连接到各个有销量的城市。代表了高达从下线到分发到各个经销商了。
换个背景颜色,更加专业了
实际工作中,总是遇到各种奇怪的场景,这种情况想要拉取某一部分的地图的话,在xlim和ylim里调整:
p1<-ggplot(data = chinamap) + geom_path(aes(x = long, y = lat, group = id),size=0.2, colour="black")+coord_map() + coord_fixed(xlim=c(103.5,104.3), ylim = c(30.4, 31.2))
下一篇会介绍如何用R画世界地图,以及如何通过python的geopandas和pyecharts画中国地图。
我是YueTan,欢迎关注