作者:噜啦啦啦啦 统计学出身 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)))+
5 background_image(img)+xlim(0,10)+ylim(0,10)+
6 geom_point()+
7 theme(axis.line=element_blank(),axis.text.x=element_blank(),
8 axis.text.y=element_blank(),axis.ticks=element_blank(),
9 axis.title.x=element_blank(),
10 axis.title.y=element_blank(),
11 panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
12 panel.grid.minor=element_blank(),plot.background=element_blank(),
13 text=element_text(family="STKaiti",size=9))+
14 #scale 标准化size的大小
15 scale_size(range = c(2,20))+
16 labs(colour='不同类',size = "人口数")+
17 ggtitle("澳大利亚人口数")
18
ggplot2里有生成gif的辅助包gganimate,步骤如下,但要注意的是,这个过程会对图片进行压缩,导致清晰度受影响,更加适合简单的图表gif。业务要求高的情况下,可以使用ps来生成gif
1#制作动图
2pp<-ggplot(data_map_, aes(lon, lat, colour = as.factor(class),size = (value)))+
3 background_image(img)+xlim(0,10)+ylim(0,10)+
4 geom_point()+
5 theme(axis.line=element_blank(),axis.text.x=element_blank(),
6 axis.text.y=element_blank(),axis.ticks=element_blank(),
7 axis.title.x=element_blank(),
8 axis.title.y=element_blank(),
9 panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
10 panel.grid.minor=element_blank(),plot.background=element_blank(),
11 text=element_text(family="STKaiti",size=9))+
12 scale_size(range = c(2,20))+
13 labs(title = 'time: {frame_time}', x = '', y = '',colour='不同类',size = "人口数")
14 transition_time(as.Date(variable)) +
15 ease_aes('linear');p
16animate(p, nframes = 24, renderer = gifski_renderer("gganim.gif"))
17
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,
3 type = "scatter",mode = 'markers',
4 text = paste("类别: ", data_map_[1:5,"class"],
5 "<br>人口数: ", data_map_[1:5,"value"],
6 "<br>地区:",data_map_[1:5,"name"])) %>%
7 layout(
8 images = list(
9 list(source = "https://raw.githubusercontent.com/diana12333/daxing/master/3be045e7b19a803485464c9fea3b3f1c.png",
10 xref = "x",
11 yref = "y",
12 x = 0.5,
13 y = 10.1,
14 sizex = 10,
15 sizey = 10,
16 sizing = "stretch",
17 opacity = 0.8,
18 layer = "below"
19 )),
20 xaxis = 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语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
给我【好看】
你也越好看!