查看原文
其他

R语言可视化——ggplot绘制中心密度辐射图

2016-12-29 小魔方 数据小魔方

今天这篇算是之前ggplot2图表系列的增补。


因为在ggplot2中一直没有看到好的关于密度辐射图(或者称它为热力辐射图,就是那种PowerMap中可以通过颜色色度探查区域指标分布密度的图表类型)的合适解决方案,最近在看github官网上ggmap的介绍帖,看到作者在ggmap函数中嵌套了geom_polygon图层并并使用fill=..level..参数和stat="density_2d"来来制作类似的热度辐射图。


我就突发奇想,如果不是通过ggmap而是通过ggplot函数是否也可以呢,果然也是可以出效果的,先将方法介绍如下:


首先需要加载如下包:


library(ggplot2)      

library(plyr)         

library(maptools) 

library(ggmap) 


接下来导入两个数据集:


其中一个是中国省级边界轮廓图,早期关注过数据小魔方的用户大概都知道,我曾经共享过一个名为rstudy的文件包(我在刘万祥老师的公众号里发现的,现在应该也还可以获取),如果手上没有数据可以添加魔方学院的QQ群,在群共享里查找R语言资料。(共享文件比较多,可能需要找一阵子)


另一个是之前在讲解REmap热度辐射图时用过的城市价值指标数据集,推送后会共享在魔方学院的QQ群里。



导入数据集:


china_map<-readShapePoly("c:/rstudy/bou2_4p.shp")  #地图数据 

china_map1 <- fortify(china_map)                   #转换为数据框

data<- read.csv(file="D:\\R\\map\\MoveChart\\cityvaluetop10.csv",header=T)  #城市指标数据



因为这里使用地图仅仅是作为底图用作定位信息,可以说是陪衬,所以无需对地图和城市指标进行合并。


以下是图表的正式生成过程:


1、画底图:


p<-ggplot()+

geom_polygon(data=china_map1,aes(x=long,y=lat,group=group),fill="#005A32",col="white")




2、添加热度图层


p<-p+geom_polygon(data=data,aes(x=lon,y=lat,fill = ..level..), stat="density_2d", alpha = .3, color = NA)+coord_map("polyconic") 




3、调整热度图层


p<-p+scale_fill_gradient2( low = "white",mid="yellow", high = "red")




4、清楚冗余元素


p<-p+theme_nothing()




5、可以给以上热图添加散点辅助观测


p<-p+geom_point(data=data,aes(x=lon,y=lat),col="white")




6、当然,你也可以给三点指定城市的指标数据使其变成气泡图


p<-p+geom_point(data=data,aes(x=lon,y=lat,size=prob),col="white")+scale_size_area(max_size=6)


#记得清除掉第5步,即从第四步开始




至于实际的数据标签,指标名称和区域名称,酌情添加,但是针对地图类图表,数据展示到位即可,不建议添加太多标签,影响美观性。


针对本图表类型,核心参数是第二个geom_polygon()中的fill = ..level..和stat="density_2d"统计变换,使得多边形图转换成为二维水平密度图,但是至今我还没有搞懂里面的算法是什么样的,只能大概模仿出来,至于怎么用,看大家自由发挥了,效果跟真正的热力辐射图还是有些差别,但是勉强能用。



总结下,用到的所有代码如下:


ggplot()+

geom_polygon(data=china_map1,aes(x=long,y=lat,group=group),fill="#005A32",col="white")+

geom_polygon(data=data,aes(x=lon,y=lat,fill = ..level..), stat="density_2d", alpha = .3, color = NA)+

coord_map("polyconic") +

geom_point(data=data,aes(x=lon,y=lat,size=prob),col="white")+

scale_size_area(max_size=6)+

scale_fill_gradient2( low = "white",mid="yellow", high = "red")+

theme_nothing()  #这一句清空主题的代码是ggmap包中的,必须加载才能用


感兴趣的小伙伴儿可以移步去github官网上搜索ggmap官方介绍,里面使用ggmap调用谷歌地图做的热度图,效果很棒。


我是分割线~


欢迎关注魔方学院R语言群



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存