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

浏览: 44

作者:噜啦啦啦啦  统计学出身  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(lonlatcolour = 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(lonlatcolour = 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(pnframes = 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,
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(010)), yaxis = list(showgrid = F,range = c(010)))
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语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册