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并放入汇报中
气泡图(来源于网络)
绘制气泡地图
1library("pacman")#加载包辅助包
2p_load(ggplot2, EBImage, jpeg, ggpubr, plotly)
3P_load(ggthemr)#配色主题包
4p_load(gganimate, animation)#制作动图
5devtools::install_github("thomasp85/gganimate")
澳大利亚地图图片版(来源于网络)
首先通过模拟生成用于作图的数据:
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)
模拟生成的绘图数据
数据整形(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
制造动态气泡图
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
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")
参考文献:
Getting Started with Plotly for R
(https://plot.ly/r/getting-started/)
往期推荐:
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法