欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可视化:中国地图R/ggplot2

程序员文章站 2022-06-08 12:58:04
...

实际工作中,很多时候有画地图的需求,只要一出现就是全ppt最靓的图了。这里介绍一下如何在R中用ggplot2画出好看的中国地图,是很多年前写的代码了,运行了一下发现还没有过时。下一篇介绍在python中如何画。

如果不想写代码,可以搜索“地图慧“,在线制作相关地图。如果有一定的基础,还是建议自己实现。因为自己做的可以更好看,更灵活,如果想要本文源代码,后台回复“地图”,可以得到本文源码和相关辅助数据。闲话不多说,撸起袖子加油干。一共就两步:

  • 准备数据

  • 画地图

准备数据阶段,我们需要国家地理信息,如果是不同的省都有各自的文件,我们这里采用全国的数据。然后就是我们自己的数据,自己的数据如果只有省份或城市,还需要一个辅助数据关联起省市与地图数据,即各个省市的经纬度。如果我们自己的数据已经自带经纬度,就省点力气了。

可视化:中国地图R/ggplot2

这三个就是我们必须的地理信息文件了

我们的数据长这个样子,其实关键的就是 City这一列,和Total Year这一列。业务意义是每个城市一整年的销量。奇奇怪怪的数据可能是某种高达模型吧。

可视化:中国地图R/ggplot2

还需要的一个辅助数据,需要知道上面各个城市的经纬度。注意这里的City名字要和上面的数据对应起来,否则无法找到该城市的位置的画,无法画出那个位置了。

可视化:中国地图R/ggplot2
这样准备工作就做好啦,开始第二步画图。

画图就比较简单,首先读取地图数据

#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)

然后得到的效果就是:

可视化:中国地图R/ggplot2
这里是模仿飞机航线,从高达的产地亦庄,连接到各个有销量的城市。代表了高达从下线到分发到各个经销商了。

可视化:中国地图R/ggplot2
换个背景颜色,更加专业了

可视化:中国地图R/ggplot2

实际工作中,总是遇到各种奇怪的场景,这种情况想要拉取某一部分的地图的话,在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,欢迎关注
可视化:中国地图R/ggplot2