可视化:中国地图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(province@data,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,欢迎关注
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38812492/article/details/107868254