R可视化:图片为背景的气泡地图

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

作者:噜啦啦啦啦统计学出身  R语言中文社区专栏作者

知乎ID:

https://www.zhihu.com/people/shen-chang-43

前言

关于气泡地图bubble map 是一种很常见的地理位置信息相关的很常见的可视化图,可同时传递多维度信息,用气泡的位置传递物理位置信息,气泡的大小表示变量1值的大小,气泡的颜色可以标识变量2的大小/类别,可以用时间frame制作.gif来表示各变量随时间的变化。

bubble map一般是通过导入.shp的地图数据来完成的,但很多情况下,标准的地图数据是很难获得的,只有图片形式的的图片,这时候为了绘制bubble map 就需要导入外部图片为ggplot的背景。下面以澳大利亚图片地图为例,展示这种情况下bubble map的画法,因为是网络图受版权保护,在实际操作中可以选择更清晰高质量的背景图。

本文包含五部分内容:

图片背景加载到ggplot和plotly图中

使用ggplot2绘制图片为背景的气泡地图

使用gganimate生成气泡gif图

使用plotly制作图片为背景的可视化地图

制作plotly的交互api并放入汇报中

R可视化:图片为背景的气泡地图

气泡图(来源于网络)

绘制气泡地图

1library("pacman")#加载包辅助包

2p_load(ggplot2, EBImage, jpeg, ggpubr, plotly)

3P_load(ggthemr)#配色主题包

4p_load(gganimate, animation)#制作动图

5devtools::install_github("thomasp85/gganimate")

R可视化:图片为背景的气泡地图

澳大利亚地图图片版(来源于网络)

首先通过模拟生成用于作图的数据:

1data_map<-as.data.frame(matrix(NA,nrow =5,ncol =23))

2colnames(data_map) <- c(seq(as.Date("2015-02-01"),length=19, by="month"),"name","lon","lat","class")

3data_map[,"class"]<-c(3,1,1,2,2)

4data_map[,"name"]<-c("西澳大利亚洲","南澳大利亚洲","北领地","昆士兰洲","新南威尔士")

5data_map[,"lon"]<-c(3,6,5,7.5,7.7)

6data_map[,"lat"]<-c(6.3,4,8.5,7.5,4.5)

7data_map[,1:19]<-matrix(ceiling(abs(rnorm(5*19,400000,40000))),nrow =5,ncol =19)

R可视化:图片为背景的气泡地图

模拟生成的绘图数据

数据整形(melt)之后完成绘图过程,在layout里使用经纬度(lon/lat)为x,y轴坐标。aes里的colour是用来区分类目的,size实现气泡效果,theme 函数用来隐藏坐标轴。

1ggthemr('dust')

2img<-readImage("//Users//dianshen//Downloads//3be045e7b19a803485464c9fea3b3f1c.png")#载入图片

3data_map_<-melt(data_map,c("lon","lat","name","class"))

4p_bm<-ggplot(data_map_[1:5,],aes(lon,lat,colour=as.factor(class),size=log(value)))+

5background_image(img)+xlim(0,10)+ylim(0,10)+

6geom_point()+

7theme(axis.line=element_blank(),axis.text.x=element_blank(),

8axis.text.y=element_blank(),axis.ticks=element_blank(),

9axis.title.x=element_blank(),

10axis.title.y=element_blank(),

11panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),

12panel.grid.minor=element_blank(),plot.background=element_blank(),

13text=element_text(family="STKaiti",size=9))+

14#scale标准化size的大小

15scale_size(range=c(2,20))+

16labs(colour='不同类',size="人口数")+

17ggtitle("澳大利亚人口数")

18

R可视化:图片为背景的气泡地图

制造动态气泡图

ggplot2里有生成gif的辅助包gganimate,步骤如下,但要注意的是,这个过程会对图片进行压缩,导致清晰度受影响,更加适合简单的图表gif。业务要求高的情况下,可以使用ps来生成gif

1#制作动图

2pp<-ggplot(data_map_,aes(lon,lat,colour=as.factor(class),size=(value)))+

3background_image(img)+xlim(0,10)+ylim(0,10)+

4geom_point()+

5theme(axis.line=element_blank(),axis.text.x=element_blank(),

6axis.text.y=element_blank(),axis.ticks=element_blank(),

7axis.title.x=element_blank(),

8axis.title.y=element_blank(),

9panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),

10panel.grid.minor=element_blank(),plot.background=element_blank(),

11text=element_text(family="STKaiti",size=9))+

12scale_size(range=c(2,20))+

13labs(title='time: {frame_time}',x='',y='',colour='不同类',size="人口数")

14transition_time(as.Date(variable)) +

15ease_aes('linear');p

16animate(p,nframes=24,renderer=gifski_renderer("gganim.gif"))

17

R可视化:图片为背景的气泡地图

plotly交互效果图

plotly库实现图片背景的形式是在layout函数中赋值image参数,但需要注意的是,目前只接受html格式的图片,用本地图片做背景可以将图片上传到公共访问的网站上,这个案例中我使用的方法是将本地图片上传到github里面的repo,source 引用图片的网址。交互图可以在图片工作区直接存储成为本地html,也可以生成api

1data_map_$class<-as.factor(data_map_$class)

2p <- plot_ly(data = data_map_[1:5,], x = ~lon, y= ~lat, color = ~value, symbol = ~class,

3type ="scatter",mode ='markers',

4text= paste("类别: ", data_map_[1:5,"class"],

5"<br>人口数: ", data_map_[1:5,"value"],

6"<br>地区:",data_map_[1:5,"name"])) %>%

7layout(

8images = list(

9list(source ="https://raw.githubusercontent.com/diana12333/daxing/master/3be045e7b19a803485464c9fea3b3f1c.png",

10xref ="x",

11yref ="y",

12x =0.5,

13y =10.1,

14sizex =10,

15sizey =10,

16sizing ="stretch",

17opacity =0.8,

18layer ="below"

19)),

20xaxis = list(showgrid = F,range = c(0,10)), yaxis = list(showgrid = F,range = c(0,10)))

21p

22chart_link = api_create(p, filename="example_plotly",sharing ="public")

生成的api如下

https://plot.ly/~dianashen/9/#/

(详情请打开浏览器输入网址查看)

注:获得API前,需要申请plotly账号在api设置里获得api key,申请网址:Make charts and dashboards online,然后保存证书许可证。

1Sys.setenv("plotly_username"="your_plotly_username")

2Sys.setenv("plotly_api_key"="your_api_key")

R可视化:图片为背景的气泡地图

参考文献:

Getting Started with Plotly for R

(https://plot.ly/r/getting-started/)

R可视化:图片为背景的气泡地图

往期推荐:

手把手教你用R语言制作网络爬虫机器人(二)

R中的子集选取运算符

如何优雅地计算多变量

R可视化:图片为背景的气泡地图

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战

回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘

回复 人工智能     三个月入门人工智能

回复 数据分析师  数据分析师成长之路 

回复 机器学习     机器学习的商业应用

回复 数据科学     数据科学实战

回复 常用算法     常用数据挖掘算法